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

一、事件发送函数介绍

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界面如下:
在这里插入图片描述
界面中创建了2个控件,其名称和类型如下表所示:

序号名称类型属性
editQTextEdit\
DeleteBtnQPushButton\

五、主程序实现

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

六、效果演示

完整效果如下:
在这里插入图片描述

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值