Qt实战案例(21)——利用事件发送函数实现预定义键盘响应事件

目录

    • 一、事件发送函数介绍
      • 1.1 sendEvent()函数
      • 1.2 postEvent()函数
    • 二、项目介绍
    • 三、项目基本配置
    • 四、UI界面设计
    • 五、主程序实现
      • 5.1 widget.h头文件
      • 5.2 widget.cpp源文件
    • 六、效果演示

一、事件发送函数介绍

1.1 sendEvent()函数

阻塞型事件发送需要重写接收对象的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界面如下:
Qt实战案例(21)——利用事件发送函数实现预定义键盘响应事件_第1张图片
界面中创建了2个控件,其名称和类型如下表所示:

序号 名称 类型 属性
edit QTextEdit \
DeleteBtn QPushButton \

五、主程序实现

5.1 widget.h头文件

头文件中需要声明一个按钮点击槽函数:

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); //发送键盘松开事件
}

六、效果演示

完整效果如下:
Qt实战案例(21)——利用事件发送函数实现预定义键盘响应事件_第2张图片

如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/75530624


ok,以上便是文章的全部内容了,如果对你有所帮助,记得点个赞哟~

你可能感兴趣的:(Qt,qt,开发语言,ui)