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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Qt中的自定义事件

發(fā)布時(shí)間:2025/4/5 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中的自定义事件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 Qt中的自主發(fā)送事件
    • 2 發(fā)送系統(tǒng)預(yù)定義的事件
    • 3 發(fā)送自定義事件

1 Qt中的自主發(fā)送事件

Qt中可以在程序中自主發(fā)送事件:

  • 阻塞型事件發(fā)送:
    • 事件發(fā)送后需要等待事件處理完成。
  • 非阻塞型事件發(fā)送:
    • 事件發(fā)送后立即返回。
    • 事件被發(fā)送到事件隊(duì)列中等待處理。

QApplication類提供了支持事件發(fā)送的靜態(tài)成員函數(shù):

  • 阻塞型發(fā)送函數(shù):bool sendEvent(QObject* receiver, QEvent* event);
  • 非阻塞型發(fā)送函數(shù):void postEvent(QObject* receiver, QEvent* event);

注意事項(xiàng):

  • sendEvent中事件對(duì)象的生命周期由Qt程序管理:
    • 同時(shí)支持棧事件對(duì)象和堆事件對(duì)象的發(fā)送。
  • postEvent中事件對(duì)象的生命周期由Qt平臺(tái)管理:
    • 只能發(fā)送堆事件對(duì)象。
    • 事件被處理后由Qt平臺(tái)銷毀。

使用sendEvent發(fā)送事件對(duì)象:

使用postEvent發(fā)送事件對(duì)象:


2 發(fā)送系統(tǒng)預(yù)定義的事件

示例代碼如下:
Widget.h:

#ifndef WIDGET_H #define WIDGET_H#include <QtGui/QWidget> #include <QPushButton>class Widget : public QWidget {Q_OBJECTQPushButton m_pushButton;void testSendEvent();void testPostEvent(); protected slots:void onButtonClicked(); public:Widget(QWidget *parent = 0);bool event(QEvent* evt);~Widget(); };#endif // WIDGET_H

Widget.cpp:

#include "Widget.h" #include <QMouseEvent> #include <QApplication> #include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent) {m_pushButton.setParent(this);m_pushButton.setText("Test");connect(&m_pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); }void Widget::onButtonClicked() {// testSendEvent();testPostEvent(); }void Widget::testSendEvent() {QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);qDebug() << "Before sendEvent()";QApplication::sendEvent(this, &dbcEvt);qDebug() << "After sendEvent()"; }void Widget::testPostEvent() {QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);qDebug() << "Before postEvent()";QApplication::postEvent(this, dbcEvt);qDebug() << "After postEvent()"; }bool Widget::event(QEvent* evt) {if( evt->type() == QEvent::MouseButtonDblClick ){qDebug() << "event(): " << evt;}return QWidget::event(evt); }Widget::~Widget() {}

main.cpp:

#include <QtGui/QApplication> #include "Widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

3 發(fā)送自定義事件

Qt可以自定義新的事件類:

  • 自定義事件類必須繼承自QEvent。
  • 自定義的事件類必須擁有全局唯一的Type值。
  • 程序中必須提供處理自定義事件對(duì)象的方法。

自定義事件類:

  • 將QEvent作為父類繼承。
  • 指定全局唯一的Type值。
  • Qt事件的Type值:

    • 每個(gè)事件類都擁有全局唯一的Type值。
    • 自定義事件類的Type值也需要自定義。
    • 自定義事件類使用Qevent::User之后的值作為Type值。
    • 程序中保證QEvent::User + VALUE全局唯一即可。

    處理自定義事件對(duì)象的方法:

  • 將事件過(guò)濾器安裝到目標(biāo)對(duì)象:在eventFilter()函數(shù)中編寫自定義事件的處理邏輯。
  • 在目標(biāo)對(duì)象的類中重寫事件處理函數(shù):在event()函數(shù)中編寫自定義事件的處理邏輯。
  • 為什么要自定義事件類?

    • 需要擴(kuò)展一個(gè)已有組件類的功能。
    • 需要開(kāi)發(fā)一個(gè)全新功能的組件類。
    • 需要像一個(gè)第三方的組件類發(fā)送消息。

    示例代碼如下:
    StringEvent.h:

    #ifndef _STRINGEVENT_H_ #define _STRINGEVENT_H_#include <QEvent> #include <QString>class StringEvent : public QEvent {QString m_data; public:const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);explicit StringEvent(QString data = "");QString data();};#endif // _STRINGEVENT_H_

    StringEvent.cpp:

    #include "StringEvent.h"StringEvent::StringEvent(QString data) : QEvent(TYPE) {m_data = data; }QString StringEvent::data() {return m_data; }

    Widget.h:

    #ifndef WIDGET_H #define WIDGET_H#include <QtGui/QWidget> #include <QLineEdit>class Widget : public QWidget {Q_OBJECTQLineEdit m_edit; public:Widget(QWidget *parent = 0);bool event(QEvent* evt);bool eventFilter(QObject* obj, QEvent* evt);~Widget(); };#endif // WIDGET_H

    Widget.cpp:

    #include "Widget.h" #include "StringEvent.h" #include <QMouseEvent> #include <QDebug> #include <QApplication>Widget::Widget(QWidget *parent): QWidget(parent), m_edit(this) {m_edit.installEventFilter(this); }bool Widget::event(QEvent* evt) {if( evt->type() == QMouseEvent::MouseButtonDblClick ){qDebug() << "event: Before sentEvent";StringEvent e("D.T.Software");QApplication::sendEvent(&m_edit, &e);qDebug() << "event: After sentEvent";}return QWidget::event(evt); }bool Widget::eventFilter(QObject* obj, QEvent* evt) {if( (obj == &m_edit) && (evt->type() == StringEvent::TYPE) ){StringEvent* se = dynamic_cast<StringEvent*>(evt);qDebug() << "Receive: " << se->data();m_edit.insert(se->data());return true;}return QWidget::eventFilter(obj, evt); }Widget::~Widget() {}

    main.cpp:

    #include <QtGui/QApplication> #include "Widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

    參考資料:

  • QT實(shí)驗(yàn)分析教程
  • 總結(jié)

    以上是生活随笔為你收集整理的Qt中的自定义事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。