Qt——发送自定义事件

1.事件是Qt平台用于描述用户 操作的对象

2.QT中可以在程序中自主发送事件

  • 阻塞型事件发送:事件发送后需要等待事件处理完成
  • 非阻塞型事件发送
    • 事件发送后立即返回
    • 事件被发送到事件队列中等待处理

QApplication类提供了支持事件发送的静态成员函数

  • 阻塞型发送函数:bool sendEvent(QObject* receiver, QEvent* event);
  • 非阻塞型发送函数:void postEvent(QObject* receiver, QEvent* event);

注意:

  • sendEvent中事件对象的生命期由Qt程序管理,同时支持栈事件对象和堆事件对象的发送
  • postEvent中事件对象的生命期由Qt平台管理,只能发送堆事件对象,事件被处理后由Qt平台销毁

在sendEvent()函数内部直接调用Qt对象的event()事件处理函数

Widget.h

复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT
    QPushButton m_pushButton;

    void testSendEvent();
    void testPostEvent();

protected slots:
    void onButtonClicked();
public:
    explicit Widget(QWidget *parent = nullptr);
    bool event(QEvent* evt);
    ~Widget() override;
};
#endif // WIDGET_H

Widget.cpp

复制代码
#include "Widget.h"
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    m_pushButton.setParent(this);
    m_pushButton.setText("Test");

    connect(&m_pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}

void Widget::testSendEvent()
{
    //事件类型:双击;鼠标坐标:窗口坐标(0,0);触发按钮:左键;其他按下的按钮:无;键盘修饰键:无
    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()
{
    //事件类型:双击;鼠标坐标:窗口坐标(0,0);触发按钮:左键;其他按下的按钮:无;键盘修饰键:无
    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);
}

void Widget::onButtonClicked()
{
    // testSendEvent();
    testPostEvent();
}

Widget::~Widget() = default;

运行结果:

执行sendEvent()时,点击按钮:

执行postEvent()时,点击按钮:

相关推荐
南境十里·墨染春水13 小时前
C++ 工厂模式:从入门到进阶,彻底掌握对象创建的艺术
开发语言·c++·算法
小白舒_SC13 小时前
多个VS版本的Qt VS Tools的QtMsBuild不兼容问题
经验分享·qt
JosieBook14 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
加号314 小时前
【C#】 文件与目录管理:创建、删除操作的技术解析
开发语言·c#
diving deep15 小时前
脚本速览-python
开发语言·python
一生了无挂15 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
swordbob15 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
小小编程路16 小时前
C++ 异常 完整讲解
开发语言·c++
AI科技星17 小时前
数术工坊 · 第四卷 橡皮泥江湖(拓扑学)【完整定稿】
c语言·开发语言·汇编·electron·概率论·拓扑学
张忠琳17 小时前
【Go 1.26.4】Golang Select 深度解析
开发语言·后端·golang