生活随笔
收集整理的這篇文章主要介紹了
Qt-窗口消息处理机制及拦截消息的五种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【Qt 攔截消息的五種方法】
覆寫框架類QCoreApplication的notify函數,這個函數將得到整個框架中所有窗口的消息給框架類安裝一個消息過濾器 QCoreApplication->nativeEventFilter(filterObj),這種我們代碼沒有實現給某窗口安裝一個消息過濾器 QPushButton->installEventFilter(filterObj)繼承某窗口并覆寫event函數(該函數負責某個窗口中派發所有子消息)繼承某窗口并覆寫窗口的某個子消息
以上介紹的幾種方法結構圖如下:
【代碼示例】
下面代碼演示了上面介紹的 1、3、4、5 四種方法,由于第二種非常難演示并且與第一種功能類似,所以我們沒有做示例。
代碼一共分7個文件:
capplication.h:繼承 QApplication 的類 CApplication 類capplication.cpp:繼承 QApplication 的類 CApplication 類的功能實現cpushbutton.h:繼承 QPushButton 的類 CPushButton 類cpushbutton.cpp:繼承 QPushButton 的類 CPushButton 類的功能實現cwidget.h:繼承 QWidget 的類 CWidget 類cwidget.cpp:繼承 QWidget 的類 CWidget 類的實現main.cpp:實例化框架和窗口對象并顯示窗口
#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)
{// 根據窗口名字判斷是否是 CWidget 窗口類的消息if (obj->objectName() == "widgets"){// 判斷消息類型是不是鼠標點擊消息if (ev->type() == QEvent::MouseButtonPress){qDebug() << "在窗口中點擊了鼠標!";}}// 將消息交還給父窗口處理,避免消息丟失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() << "截獲鼠標按下消息...";// 因為最底層的消息沒有返回值// 可以調用accept函數告知父類已經處理過該消息e->accept();
}void CPushButton::mouseReleaseEvent(QMouseEvent *e)
{qDebug() << "截獲鼠標彈起消息...";// 表示對此消息不感興趣,交由父類的消息處理函數去處理。// 實際我們已經在這個消息處理函數中打印了一句話// 這樣父類、子類都會對這個消息做處理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)
{// 設置自身窗口的名字,好讓父類可以識別這個窗口進行消息處理this->setObjectName("widgets");_button = new CPushButton;_button->setText("button");_button->setParent(this);_button->installEventFilter(this);
}bool CWidget::eventFilter(QObject *obj, QEvent *ev)
{// 判斷對象是否是 button 對象if (obj == _button){// 判斷消息是否是單擊消息if (ev->type() == QEvent::MouseButtonPress){// 對鼠標單擊處理...}}// 把消息交還給父類處理,這樣消息就不會丟失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();
}
總結
以上是生活随笔為你收集整理的Qt-窗口消息处理机制及拦截消息的五种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。