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