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