- 一、事件发送函数介绍
- 1.1 sendEvent()函数
- 1.2 postEvent()函数
- 二、项目介绍
- 三、项目基本配置
- 四、UI界面设计
- 五、主程序实现
- 5.1 widget.h头文件
- 5.2 widget.cpp源文件
- 六、效果演示
阻塞型事件发送需要重写接收对象的event()事件处理函数,当事件发送后,将会立即进入event()事件处理函数进行事件处理,通过sendEvent()静态函数实现阻塞发送。
函数介绍: bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
使用notify()函数将事件直接发送到接收方。返回从事件处理程序返回的值。
- receiver:接收对象;
- event:要发送的event类型(比如:鼠标双击)
发送事件后,不会删除该事件。例如,通常的方法是在堆栈上创建事件。
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);
sendEvent()函数是阻塞式的,所以支持栈空间/堆空间事件对象的发送(局部对象和new分配的对象),new分配的事件对象被处理后,会由Qt内部自动摧毁。
1.2 postEvent()函数非阻塞型事件发送需要重写接收对象的event()事件处理函数,当事件发送后立即返回,事件将会发送到事件队列中等待处理,通过postEvent()静态函数实现非阻塞发送。
函数介绍: void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
将对象接收方作为事件接收方的事件添加到事件队列并立即返回。 必须在堆上分配该事件,因为post事件队列将获得该事件的所有权,并在发布后将其删除。发布事件后访问该事件是不安全的。 当控件返回到主事件循环时,将使用notify()函数发送队列中存储的所有事件。
postEvent()函数是非阻塞式的,所以只能支持栈堆空间事件对象的发送(new分配的对象),new分配的事件对象被处理后,会由Qt内部自动摧毁。
二、项目介绍利用sendEvent()事件发送函数发送预定义的键盘Delete按键事件。
三、项目基本配置新建一个Qt案例,项目名称为“sendEvent”,基类选择“QWidget”,创建UI界面复选框的选中状态,完成项目创建。
四、UI界面设计UI界面如下: 界面中创建了2个控件,其名称和类型如下表所示:
头文件中需要声明一个按钮点击槽函数:
private slots:
void on_DeleteBtn_clicked();
5.2 widget.cpp源文件
定义按钮点击槽函数:
//按钮点击槽函数
void Widget::on_DeleteBtn_clicked()
{
int key = Qt::Key_Delete ; //定义删除按键
QKeyEvent EventPress(QEvent::KeyPress,key,Qt::NoModifier);//构建KeyEvent对象
QApplication::sendEvent(ui->edit,&EventPress); //发送键盘按下事件
QKeyEvent EventRelease(QEvent::KeyRelease,key,Qt::NoModifier);
QApplication::sendEvent(ui->edit,&EventRelease); //发送键盘松开事件
}
六、效果演示
完整效果如下:
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/75530624
ok,以上便是文章的全部内容了,如果对你有所帮助,记得点个赞哟~