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

这篇具有很好参考价值的文章主要介绍了Qt/QtCreator:主动触发鼠标或键盘事件QMouseEvent与QKeyEvent。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方法:

        构造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的示例:文章来源地址https://www.toymoban.com/news/detail-552905.html

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

到了这里,关于Qt/QtCreator:主动触发鼠标或键盘事件QMouseEvent与QKeyEvent的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

    说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,以及可以在场景中进行右键操作等。 示例 myitem 为自定义QGraphicsItem,实现了边框、重绘事件、鼠标悬停、按键、右键菜单等功能。 myitem.h myi

    2024年02月04日
    浏览(48)
  • JavaScript 鼠标事件监听&&触发时机&&触发顺序

    有时间整理下鼠标的监听事件,目前汇总到的鼠标监听事件以下10个: 目录 1. click 2. dblclick 3.contextmenu 4.mousedown 5.mouseup 6.mouseenter 7.mouseleave 8.mouseover 9.mouseout 10.mousemove 先说下触发时机和作用键(左键、右键) 点击事件,只有左键生效 双击事件,只有左键生效 跟click事件对比

    2024年02月08日
    浏览(52)
  • 基于MFC的键盘响应(热键触发事件)

    通过输入 CTRL + G 组合按键完成文件选择框弹出: 目标: 按下 CTRL + G ,弹出文件选择框 过程: 头文件添加消息申明 cpp文件添加消息映射 OnInitDialog添加全局热键注册 实现热键功能函数 MFC键盘宏定义: 功能键: VK_TAB : Tab键。 VK_SPACE : 空格键。 VK_BACK : 退格键(回退键)。

    2024年02月04日
    浏览(44)
  • vue2:鼠标触发各类事件

    移动端 pc端 template javascript 如何获取鼠标的x,y坐标 这就要利用事件回调中的 e.targetTouches 属性了。 如何获取鼠标每次移动的差值 当鼠标移动时,如何计算得出,当前鼠标位置与上一次鼠标位置的差值呢? 例如,当前鼠标位置为(1,2),上一次鼠标位置为(0,0),差值就是: x:1,

    2024年04月13日
    浏览(39)
  • 【Unity功能】鼠标移动触发事件方法

     方法一:方法触发 注意:UGUI不能使用该方法 方法二:Event Trigger 注意:需要场景中包含EventSystem(在添加trigger组件后自动添加);UGUI可以使用 方法三:

    2024年01月25日
    浏览(31)
  • vue 项目中使用键盘回车按键触发事件

    我最近项目要求按下enter键就登录或者注册之类的触发,我不知道为什么用vue的 @click.enter这样的不管用,到现在都没整明白为啥,希望知道的给讲解一下. 我看了半天人家是给页面加了一个监听 然后在methods里面加上一个方法,监听这个方法,e.keyCode 是每个按键的编码,13是回车键

    2024年02月11日
    浏览(42)
  • vue 项目中使用键盘回车或空格按键触发事件

    话不多说上代码!!! 一开始以为很复杂,经过一番摸索和查找,发现也没有那么难,具体如下: 1、先在 created 里边开启键盘按键的监听事件,如下: 2、在 methods 里边添加按键之后需要执行的方法即可,具体如下: 解析:e.keyCode 是每个按键的编码,13是回车键,32是空格

    2024年02月11日
    浏览(45)
  • [pyqt5]触发ctrl+鼠标滚轮事件

    有时候我们需要按住Ctrl+鼠标滚轮实现图像放大或者缩小,因此需要这个事件,具体看代码

    2024年02月13日
    浏览(47)
  • JS 鼠标事件与键盘事件

    一、鼠标事件         onclick        鼠标点击左键触发         onmouseover    鼠标经过触发         onmouseout     鼠标离开触发         onfocus        获得鼠标焦点触发         onblur         失去鼠标焦点触发         onmousemove    鼠标移动出发    

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包