1、在程序中发送事件
Qt中可以在程序中自主发送事件
-阻塞型事件发送
事件发送后需要等待事件处理完成
-非阻塞型事件发送
事件发送后立即返回
事件被发送到事件队列中等待处理
QApplication类提供了支持事件发送的静态成员函数
-阻塞型发送函数:
bool sendEvent(QObject* receiver, QEvent* event);
-非阻塞型发送函数:
bool postEvent(QObject* receiver, QEvent* event);
注意事项
-sendEvent中事件对象的生命期由Qt程序管理
. 同时支持栈事件对象和堆事件对象的发送
-postEvent中事件对象的生命期由Qt平台管理
. 只能发送堆事件对象
. 事件被处理后由Qt平台销毁
使用sendEvent发送事件对象
小贴士:
消息发送过程可以理解为:在sendEvent()函数内
部直接调用Qt对象的event()事件处理函数。
这样event函数return,sendEvent才能return
使用postEvent发送事件对象
2、编程实验
在程序中发送事件 43-1.pro
Widgte.cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
QPushButton m_pushButton;
void testSendEvent();
void testPostEvent();
protected slots:
void onButtonClicked();
public:
Widget(QWidget *parent = 0);
bool event(QEvent* evt);
~Widget();
};
#endif // WIDGET_H
Widget.cpp
#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()
{
// testSendEvent();
//testPostEvent();
}
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);//将事件发送给当前Widget对象
qDebug() << "After sendEvent()";
}
void Widget::testPostEvent()
{
QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
qDebug() << "Before postEvent()";
QApplication::postEvent(this, dbcEvt);
//在点击按钮后会产生一个点击事件,在onButtonClicked()槽函数内部调用testPostEvent()
//产生一个新事件,当然不会立即处理,会放入事件队列,等点击事件处理完后再处理
qDebug() << "After postEvent()";
}
bool Widget::event(QEvent* evt)//重写event()函数
{
if( evt->type() == QEvent::MouseButtonDblClick )
{
qDebug() << "event(): " << evt;
}
return QWidget::event(evt);
}
Widget::~Widget()
{
}
1、当调用testSendEvent()
先双击窗口再点击按钮
2、当调用testPostEvent()
先双击窗口再点击按钮
3、文本编辑器中的事件发送
菜单栏中删除功能的实现
1、定义事件对象KeyPress
2、定义事件对象KeyRelease
3、发送事件KeyPress
4、发送事件KeyRelease
模拟键盘delete键的按下与释放
4、编程实验
文本编辑器中的事件发送 NotePad.pro
关联槽函数
connect(action, SIGNAL(triggered()), this, SLOT(onEditDelete()));
实现槽函数
void MainWindow::onEditDelete()
{
QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);//只按delete键(不包括ctrl等)事件
QKeyEvent keyRelease(QEvent::KeyRelease, Qt::Key_Delete, Qt::NoModifier);//只释放
QApplication::sendEvent(&mainEditor, &keyPress);//发送到编辑框对象
QApplication::sendEvent(&mainEditor, &keyRelease);
}
5、小结
Qt程序中能够自主的发送系统事件
QApplication类提供了支持事件发送的成员函数
sendEvent()发送事件后需要等待事件处理完成
postEvent()发送事件后立即返回