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

相关推荐
冯汉栩5 小时前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
从小就看凹凸曼^o^6 小时前
Python基础5 - 字典与集合:(1)字典
开发语言·python
侧耳倾听1116 小时前
java 日志框架简介
java·开发语言
zlinear数据采集卡6 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
全栈技术负责人6 小时前
解密 MCP(Model Context Protocol):大模型时代的“Type-C”总线与三驾马车架构深度解析
开发语言·ai·架构
丰锋ff7 小时前
1.7在Qt窗口中添加右键菜单
开发语言·qt
Titan20247 小时前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++
流浪0017 小时前
Python基础语法(三):函数
开发语言·python
鸿芯微控科技7 小时前
压电点胶阀出胶量不稳定怎么排查?驱动波形、背压、点胶重量与Python分析
开发语言·python·压电点胶阀·精密点胶·点胶重量·流体控制
原野池予8 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言