Qt/QtCreator:主动触发鼠标或键盘事件QMouseEvent与QKeyEvent

文章介绍了Qt中的QApplication::sendEvent和QApplication::postEvent函数,用于向目标对象发送QMouseEvent和QKeyEvent。sendEvent是同步的,会阻塞直到事件处理完成,而postEvent是异步的,将事件放入事件队列,提高程序响应性但可能有延迟。文章提供了一个在MainWindow中触发和接收这些事件的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法:

        构造QMouseEvent或QKeyEvent,使用QApplication::sendEvent或postEvent进行投送事件    。

        QApplication::sendEvent()和QApplication::postEvent()都是Qt中用于发送事件的函数,它们之间的区别在于事件的处理方式。

        QApplication::sendEvent(target, event)是直接将事件event发送给目标target,并阻塞当前线程等待目标处理完事件后再继续执行,这个过程类似于一个同步调用。
        QApplication::postEvent(target, event)则是将事件event放入目标target的事件队列中,并立即返回,在目标及其父级窗口的事件循环下一次轮询时会取出该事件进行处理。这个过程类似于一个异步调用。
        因此,使用QApplication::postEvent()能够避免当前线程等待目标窗口处理事件而被阻塞的情况,可以提高程序的响应性。但也需要注意的是,由于QApplication::postEvent()是基于事件循环的机制进行处理的,所以它并不是实时的,可能会存在一定的延迟。如果需要立即处理事件并等待结果,则应该使用QApplication::sendEvent()。

以下是在MainWindow实现的,主动触发、接收QMouseEvent及QKeyEvent的示例:

//MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QKeyEvent>
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

    void mousePressEvent(QMouseEvent* )override;
    void keyPressEvent(QKeyEvent* )override;

    ~MainWindow();
protected:
    void sendMouseEvent();
    void sendKeyEvent();
private:
    bool currentMouseEvent {false};
};

#endif // MAINWINDOW_H
//MainWindow.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{    
    QTimer* timer = new QTimer(this);
    timer->start(1000);

    connect(timer,&QTimer::timeout,this,[=]{
        if(currentMouseEvent)
        {
            this->sendKeyEvent();
            currentMouseEvent = false;
        }
        else {
            currentMouseEvent = true;
            this->sendMouseEvent();
        }
    });
}

MainWindow::~MainWindow()
{

}

//鼠标事件
void MainWindow::mousePressEvent(QMouseEvent *eve)
{
    if(eve->button() == Qt::LeftButton)
        qDebug()<<"鼠标左键点击";
    QMainWindow::mousePressEvent(eve);
}

//键盘事件
void MainWindow::keyPressEvent(QKeyEvent *eve)
{
    if(eve->key() == Qt::Key_Enter)
        qDebug()<<"键盘回车按下";
    QMainWindow::keyPressEvent(eve);
}

//手动触发键盘事件
void MainWindow::sendKeyEvent(){
    QKeyEvent *event = new QKeyEvent(QEvent::KeyPress,
                                      Qt::Key_Enter,
                                      Qt::NoModifier,
                                      "");

    QApplication::postEvent(this, event);
}

//手动触发鼠标事件
void MainWindow::sendMouseEvent()
{
    QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress,
                                          QPointF(width()/2, height()/2),
                                          Qt::LeftButton,
                                          Qt::LeftButton,
                                          Qt::NoModifier);

    QApplication::postEvent(this, event);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值