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

相关推荐
WJ.Polar15 小时前
Java封装、继承、多态
java·开发语言
摇滚侠15 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
weixin_3077791315 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
爱读书的小胖16 小时前
Codewars:Rot13(C)解题分析
c语言·开发语言
鸽鸽程序猿16 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
Lhappy嘻嘻16 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
weixin_3077791317 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿17 小时前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
Wang's Blog17 小时前
Java 项目实战: 交友项目 - 个人资料管理的需求分析与接口设计
java·开发语言·交友
1024奇点17 小时前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源