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

相关推荐
霍霍的袁2 小时前
【C++初阶】缺省参数(默认参数)详细讲解
开发语言·c++·算法
I Promise343 小时前
多传感器融合&模型后处理C++工程师面试参考回答
开发语言·c++·面试
2501_932750263 小时前
Java反射机制基础入门
java·开发语言
霍霍的袁3 小时前
【C++初阶】函数重载详细讲解
开发语言·c++·算法
threelab3 小时前
Three.js 黑洞引力效果着色器 | 三维可视化 / AI 提示词
开发语言·javascript·着色器
陌路203 小时前
详解C++ 高性能网络库 muduo 的精简日志模块
开发语言·c++·php
asdfg12589633 小时前
Java中的Comparator 和JS中的回调函数好相似
java·开发语言
lly2024063 小时前
Python SMTP邮件发送教程
开发语言
我是伪码农3 小时前
小程序100-125
开发语言·小程序·php