生活随笔
收集整理的這篇文章主要介紹了
Qt-窗口消息处理机制及拦截消息的五种方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【Qt 攔截消息的五種方法】
覆寫(xiě)框架類(lèi)QCoreApplication的notify函數(shù),這個(gè)函數(shù)將得到整個(gè)框架中所有窗口的消息給框架類(lèi)安裝一個(gè)消息過(guò)濾器 QCoreApplication->nativeEventFilter(filterObj),這種我們代碼沒(méi)有實(shí)現(xiàn)給某窗口安裝一個(gè)消息過(guò)濾器 QPushButton->installEventFilter(filterObj)繼承某窗口并覆寫(xiě)event函數(shù)(該函數(shù)負(fù)責(zé)某個(gè)窗口中派發(fā)所有子消息)繼承某窗口并覆寫(xiě)窗口的某個(gè)子消息
以上介紹的幾種方法結(jié)構(gòu)圖如下:
【代碼示例】
下面代碼演示了上面介紹的 1、3、4、5 四種方法,由于第二種非常難演示并且與第一種功能類(lèi)似,所以我們沒(méi)有做示例。
代碼一共分7個(gè)文件:
capplication.h:繼承 QApplication 的類(lèi) CApplication 類(lèi)capplication.cpp:繼承 QApplication 的類(lèi) CApplication 類(lèi)的功能實(shí)現(xiàn)cpushbutton.h:繼承 QPushButton 的類(lèi) CPushButton 類(lèi)cpushbutton.cpp:繼承 QPushButton 的類(lèi) CPushButton 類(lèi)的功能實(shí)現(xiàn)cwidget.h:繼承 QWidget 的類(lèi) CWidget 類(lèi)cwidget.cpp:繼承 QWidget 的類(lèi) CWidget 類(lèi)的實(shí)現(xiàn)main.cpp:實(shí)例化框架和窗口對(duì)象并顯示窗口
#ifndef CAPPLICATION_H
#define CAPPLICATION_H#include <QApplication>
#include <QDebug>class CApplication : public QApplication
{
public:CApplication(int argc, char* argv[]);bool notify(QObject *, QEvent *);
};#endif // CAPPLICATION_H
#include "capplication.h"CApplication::CApplication(int argc, char* argv[]):QApplication(argc, argv)
{}bool CApplication::notify(QObject *obj, QEvent *ev)
{// 根據(jù)窗口名字判斷是否是 CWidget 窗口類(lèi)的消息if (obj->objectName() == "widgets"){// 判斷消息類(lèi)型是不是鼠標(biāo)點(diǎn)擊消息if (ev->type() == QEvent::MouseButtonPress){qDebug() << "在窗口中點(diǎn)擊了鼠標(biāo)!";}}// 將消息交還給父窗口處理,避免消息丟失QApplication::notify(obj, ev);
}
#ifndef CPUSHBUTTON_H
#define CPUSHBUTTON_H#include <QPushButton>
#include <QDebug>
#include <QMouseEvent>class CPushButton : public QPushButton
{
public:CPushButton();void mousePressEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);};#endif // CPUSHBUTTON_H
#include "cpushbutton.h"CPushButton::CPushButton()
{}void CPushButton::mousePressEvent(QMouseEvent *e)
{qDebug() << "截獲鼠標(biāo)按下消息...";// 因?yàn)樽畹讓拥南](méi)有返回值// 可以調(diào)用accept函數(shù)告知父類(lèi)已經(jīng)處理過(guò)該消息e->accept();
}void CPushButton::mouseReleaseEvent(QMouseEvent *e)
{qDebug() << "截獲鼠標(biāo)彈起消息...";// 表示對(duì)此消息不感興趣,交由父類(lèi)的消息處理函數(shù)去處理。// 實(shí)際我們已經(jīng)在這個(gè)消息處理函數(shù)中打印了一句話// 這樣父類(lèi)、子類(lèi)都會(huì)對(duì)這個(gè)消息做處理e->ignore();
}
#ifndef CWIDGET_H
#define CWIDGET_H#include <QWidget>
#include <QObject>
#include <QEvent>
#include "cpushbutton.h"class CWidget : public QWidget
{Q_OBJECT
public:explicit CWidget(QWidget *parent = 0);CPushButton* _button;bool eventFilter(QObject *, QEvent *);signals:public slots:
};#endif // CWIDGET_H
#include "cwidget.h"CWidget::CWidget(QWidget *parent) : QWidget(parent)
{// 設(shè)置自身窗口的名字,好讓父類(lèi)可以識(shí)別這個(gè)窗口進(jìn)行消息處理this->setObjectName("widgets");_button = new CPushButton;_button->setText("button");_button->setParent(this);_button->installEventFilter(this);
}bool CWidget::eventFilter(QObject *obj, QEvent *ev)
{// 判斷對(duì)象是否是 button 對(duì)象if (obj == _button){// 判斷消息是否是單擊消息if (ev->type() == QEvent::MouseButtonPress){// 對(duì)鼠標(biāo)單擊處理...}}// 把消息交還給父類(lèi)處理,這樣消息就不會(huì)丟失QWidget::eventFilter(obj, ev);
}
#include "capplication.h"
#include "cwidget.h"int main(int argc, char* argv[])
{CApplication app(argc, argv);CWidget w;w.show();return app.exec();
}
總結(jié)
以上是生活随笔為你收集整理的Qt-窗口消息处理机制及拦截消息的五种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。