日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt-窗口消息处理机制及拦截消息的五种方法

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-窗口消息处理机制及拦截消息的五种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。