QT事件事件之一:Qt中的事件处理与传递
QT事件事件之一:Qt中的事件處理與傳遞
- 前言
- 一、簡介
- 二、QT中的事件
- 三、事件的實現(xiàn)的方法
前言
在QT中,事件是我們很常用的東西,以下是我用事件時總結(jié)和做法
一、簡介
在QT中,事件作為一個對象,繼承QEvent類,常見的有鍵盤事件QKeyEvent、鼠標事件QMouseEvent和定時器事件QTimerEvent等,與QEvent類的繼承關(guān)系如圖所示。
二、QT中的事件
事件是對各種應用程序需要知道的由應用程序內(nèi)部或者外部產(chǎn)生的事件的通稱。在QT中使用一個對象來表示一個事件,繼承自QEvent類。事件與信號是不同的,他們的區(qū)別是
信號:
1.信號不是事件,信號的本質(zhì)是回調(diào)函數(shù),在一個線程中可看作是同步操作
2.同時信號的發(fā)出者是對象,信號不會循環(huán),接收者會立即收到
3.信號的返回值無意義
事件
1.事件一般是通過postEvent()函數(shù)進入到主循環(huán)隊列中,是異步操作
2.事件的發(fā)出者一般是窗口系統(tǒng),少數(shù)來自系統(tǒng)的內(nèi)部
3.事件回調(diào)時是以當前窗口開始,一級一級向上派發(fā),直到有一個窗口返回true,截斷事件處理中心
4.事件根據(jù)返回值判斷事件是否被處理
注意:
1、信號有具體的對象發(fā)出,然后馬上交給connect()函數(shù)連接的槽進行處理,而對于事件,Qt使用一個隊列事件對所有的事件進行維護,當新的事件產(chǎn)生時,會被追加到事件隊列的尾部。
2、信號一旦發(fā)出,槽函數(shù)一定會執(zhí)行,事件可以用過濾器過濾.
3、信號與槽中,發(fā)送者所在的線程是無關(guān)緊要的。在自動連接情況下,Qt需要查看信號發(fā)出的線程是不是和信號接收者的線程一致,來決定連接的類型!
三、事件的實現(xiàn)的方法
代碼如下(示例):
#ifndef MYLABEL_H #define MYLABEL_H#include <QWidget> #include <QLabel> #include <QDebug> class mylabel : public QLabel {Q_OBJECT public:explicit mylabel(QWidget *parent = 0);//鼠標進入void enterEvent(QEvent *event);//鼠標離開void leaveEvent(QEvent *event);signals:public slots: };#endif // MYLABEL_H #include "mylabel.h"mylabel::mylabel(QWidget *parent) : QLabel(parent) {}void mylabel::leaveEvent(QEvent *event) {qDebug()<<"鼠標離開了"; }void mylabel::enterEvent(QEvent *event) {qDebug()<<"鼠標進入了"; }這是我自定義的mylabel類來實現(xiàn)事件。此時我們只是實現(xiàn)了事件的功能,但是我們卻沒有對綁定相關(guān)的控件來實現(xiàn)這。第一種方法是我們在ui界面中,畫一個label,然后將提升為mylabel自定義類。
第二種方法,我們使用的是事件過濾器的形式來完成
代碼如下(示例):
代碼如下(示例):
#include "mylabel.h"mylabel::mylabel(QWidget *parent) : QLabel(parent) {this->resize(300,500);this->setText("標簽");btn_1=new QPushButton("登錄",this);btn_1->installEventFilter(this);}bool mylabel::eventFilter(QObject *watched, QEvent *event) {if(watched==btn_1 && event->type()==QEvent::MouseButtonPress){qDebug()<<"找到btn_1";} }總結(jié)
以上是生活随笔為你收集整理的QT事件事件之一:Qt中的事件处理与传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暗区突围手游高资源区在哪
- 下一篇: C++四种强制类型转换