一、在程序中发送事件
1、Qt可以在程序中自主发送事件
(1)、堵塞型事件发送
A、事件发送完后需要等待事件处理完成
(2)、非堵塞型事件发送
A、事件发送后立即返回
B、事件被发送到事件队列中等待处理
2、QApplication类提供了支持事件发送的静态成员函数
3、注意事项
(1)、sendEvent中事件对象生命期由Qt程序管理
A、同时支持栈事件对象和堆事件对象的发送
(2)、postEvent中事件对象的生命周期由Qt平台管理
A、只能发送堆事件对象
B、事件被处理后由Qt平台销毁
4、事件发送过程
#include "Widget.h"
#include <QMouseEvent>
#include <QApplication>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_pushButton.setParent(this);
m_pushButton.setText("Test");
connect(&m_pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
}
void Widget::onButtonClicked()
{
qDebug() << "void Widget::onButtonClicked()";
testSendEvent();
// testPostEvent();
}
void Widget::testSendEvent()
{
//创建一个鼠标左键双击事件对象:
//参数type:QEvent::MouseButtonPress, QEvent::MouseButtonRelease,QEvent::MouseButtonDblClick, or QEvent::MouseMove之一
//参数position:鼠标指针相对于接收窗口的位置
//参数button:左键、右键等发生的事件。如果是mouseMove事件,则为Qt::NoButton
//参数buttons和modifiers:当事件发生时鼠标和键盘的状态位
QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0),Qt::LeftButton,
Qt::NoButton,Qt::NoModifier);//dbcEvt:double clicked event
qDebug() << "Before sendEvent()";
QApplication::sendEvent(this, &dbcEvt);//相当于直接调用Widget::event();
qDebug() << "After sendEvent";
}
void Widget::testPostEvent()
{
//postEvent必须发送一个堆对象
QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0),Qt::LeftButton, Qt::NoButton,Qt::NoModifier);//dbcEvt:double clicked event
qDebug() << "Before postEvent()";
//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);
}
Widget::~Widget()
{
}
二、文本编辑器中的事件发送
1、菜单栏中删除功能的实现
(1)、自定义事件对象KeyPress
(2)、自定义事件对象KeyRelease
(3)、发送事件KeyPress
(4)、发送事件KeyRelease
文本编辑器程序:
void MainWindow::onFileDelete()
{
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Delete,Qt::NoModifier);
QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Delete,Qt::NoModifier);
QApplication::sendEvent(&mainEdit, &keyPress);//发送事件模拟键盘的delete键
QApplication::sendEvent(&mainEdit, &keyRelease);
}
void MainWindow::onFileExit()
{
close();
}
三、小结
(1)、Qt程序中能够自主地发送系统预定义的事件(系统中存在的事件)
(2)、QApplication类提供了支持事件发送的静态成员函数
(3)、sendEvent发送事件后需要等待事件处理完成
(4)、postEvent发送事件后立即返回