38、自定义事件---------事件系统

张开发
2026/4/6 2:08:45 15 分钟阅读

分享文章

38、自定义事件---------事件系统
我们期望实现一个窗口里面有一个按钮点击按钮后弹出信息显示收到了自定义的事件开发思路我们可以自定义一个事件类型在Qt里允许我们自定义事件在QEvent::User就是QT留给用户自定义的事件类型id我们可以基于这个id加1自定义自己的事件// 定义自定义事件类型 const QEvent::Type MyCustomEventType static_castQEvent::Type(QEvent::User 1);自定义事件类// 自定义事件类 class MyCustomEvent : public QEvent { public: // QEvent构造函数需要一个事件类型我们自定义了一个类型 // message为我们要记录的事件信息 MyCustomEvent(const QString message) : QEvent(MyCustomEventType), message(message) { } //添加方法获取事件信息 QString getMessage() const { return message; } private: QString message; };再自定义一个接受事件的窗口// 接收自定义事件的窗口 class EventReceiver : public QWidget { public: EventReceiver(QWidget *parent nullptr) : QWidget(parent) { resize(600,400); QPushButton *button new QPushButton(Send Custom Event, this); QVBoxLayout *layout new QVBoxLayout(this); layout-addWidget(button); setLayout(layout); //链接按钮点击事件按钮按下后触发发送自定义事件的槽函数 connect(button, QPushButton::clicked, this, EventReceiver::sendCustomEvent); } protected: // 重写事件处理函数 bool event(QEvent *event) override { //如果是我们自定义的事件则弹出信息并且直接返回 if (event-type() MyCustomEventType) { MyCustomEvent *customEvent static_castMyCustomEvent*(event); QMessageBox::information(this, Custom Event Received, customEvent-getMessage()); return true; // 事件已被处理 } return QWidget::event(event); // 交给基类处理其他类型的事件 } private slots: void sendCustomEvent() { // 创建并发送自定义事件 MyCustomEvent *event new MyCustomEvent(This is a custom event!); // 将事件投递到对象的待处理事件队列里 QCoreApplication::postEvent(this, event); } };主函数中调用自定义的窗口int main(int argc, char *argv[]) { QApplication a(argc, argv); EventReceiver receiver; receiver.show(); return a.exec(); }运行后点击按钮会在槽函数sendCustomEvent内派发自定义的MyCustomEvent事件投递给自己QT事件循环会从EventReceiver的事件队列里依次取出事件处理每次都会触发event函数当取到MyCustomEventType类型时就弹出我们自定义的消息框了。

更多文章