方法:
构造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()。文章来源:https://www.toymoban.com/news/detail-552905.html
以下是在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模板网!