1、在程序中发送事件
1.1、 Qt可以在程序中自主发送事件
1.1.1、 堵塞型事件发送
A、 事件发送完后需要等待事件处理完成
1.1.2、 非堵塞型事件发送
A、 事件发送后立即返回
B、 事件被发送到事件队列中等待处理
1.2、 QApplication类提供了支持事件发送的静态成员函数
1.3、注意事项、
1.3.1、 sendEvent中事件对象生命期由Qt程序管理
A、 同时支持栈事件对象和堆事件对象的发送
1.3.2、 postEvent中事件对象的生命周期由Qt平台管理
A、 只能发送堆事件对象
B、 事件被处理后由Qt平台销毁
C、 事件发送过程
1.4、事件发送过程、
1.4.1、使用sendEvent发送事件对象
1.4.2、使用postEvent发送事件对象
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
private:
QPushButton m_pushButton;
void testSendEvent();
void testPostEvent();
protected slots:
void onButtonClicked();
public:
Widget(QWidget *parent = 0);
bool event(QEvent *evt);
~Widget();
};
#endif // WIDGET_H
//两种方式的比较、
#include "Widget.h"
#include <QDebug>
#include <QApplication>
#include <QMouseEvent>
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()";
//testPostEvent();
testSendEvent();
}
void Widget::testSendEvent()
{
//创建一个鼠标左键双击事件对象(dbcEvt:double clicked event):
//参数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);
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);
qDebug() << "Before PostEvent()";
//postEvent以后,事件对象的生命周期由消息队列来自行负责管理。
QApplication::postEvent(this, dbcEvt);//相当于直接调用Widget::event();,立即返回。
qDebug() << "After PostEvent()";
}
bool Widget::event(QEvent *evt)//自定义事件
{
if(evt->type() == QEvent::MouseButtonDblClick)
{
qDebug() << "event()" << evt;//执行双击Button事件
}
//如果不是左键单击2次,就交给父组件处理
return QWidget::event(evt);//将事件抛给父组件,返回事件是否执行成功。
}
Widget::~Widget()
{
}
2、文本编辑器中的事件发送
2.1、 菜单栏中删除功能的实现
2.1.1、自定义事件对象KeyPress
2.1.2、 自定义事件对象KeyRelease
2.1.3、 发送事件KeyPress
2.1.4、 发送事件KeyRelease
NotePad文本编辑器程序
头文件中声明。
//删除选中文字功能。
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()
{
this->close();
}
3、小结
3.1、 Qt程序中能够自主地发送系统预定义的事件(系统中存在的事件)
3.2、 QApplication类提供了支持事件发送的静态成员函数
3.3、 sendEvent发送事件后需要等待事件处理完成(阻塞的)
3.4、 postEvent发送事件后立即返回(非阻塞的)