QT鼠标事件和按键事件

当用户操作鼠标在特定区域内移动,状态栏右侧会实时显示当前鼠标所在的位置信息;当用户按下鼠标键时,状态栏左侧会显示用户按下的键属性(左键、右键或中键),并显示按键时的鼠标位置;当用户松开鼠标键时,状态栏左侧又会显示松开时的位置信息。

构造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()。

mainwind.h

//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

mainwind.cpp

//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);
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寒听雪落

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

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

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

打赏作者

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

抵扣说明:

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

余额充值