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()时,点击按钮:

相关推荐
码兄科技1 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
Drone_xjw2 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
SL-staff3 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
2zcode4 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
必须得开心呀5 小时前
QT解决中文乱码问题
开发语言·qt
熊猫_豆豆5 小时前
QT6 Android C++ 自制美观闹钟
android·c++·qt·闹钟
这不小天嘛6 小时前
JAVA八股——redis篇
java·开发语言·redis
逝水无殇7 小时前
C# 字符串(String)详解
开发语言·后端·c#
精明的身影7 小时前
C++自学之路1:Hello world
开发语言·c++
leo__5208 小时前
基于导航数据的扩展卡尔曼滤波(EKF)MATLAB 实现
开发语言·matlab