将事件发布到 Qt GUI 线程以模拟按键

Posted

技术标签:

【中文标题】将事件发布到 Qt GUI 线程以模拟按键【英文标题】:Post event to Qt GUI thread to simulate key press 【发布时间】:2013-11-19 15:05:18 【问题描述】:

我想在 Qt 中模拟按键。我在网上找到了一些例子,但还没有得到它的工作。我有这个方法:

void SimKeyEvent::pressTab()

    QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier);
    QCoreApplication::postEvent(receiver, event);

我不知道如何正确处理上面代码行中应该是“接收器”的 GUI 线程。我尝试过的是传递“应用程序”:

QGuiApplication app(argc, argv);

通过 SimKeyEvent 类构造器并为其创建一个私有指针。

在 main.cpp 中:

SimKeyEvent *simKeyEvent = new SimKeyEvent(0, &app);

SimKeyEvent.h

private:
    QGuiApplication *app;

SimKeyEvent 构造函数:

SimKeyEvent::SimKeyEvent(QObject *parent, QGuiApplication *app) :
    QObject(parent)

    this->app = app;

那我改成:

QCoreApplication::postEvent(app, event);

这不起作用,我不知道代码是否有问题,或者是否应该以不同的方式完成。

main.cpp:

int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);
    QtQuick2ApplicationViewer viewer;
    viewer.setMainQmlFile(QStringLiteral("qml/GC/MainMenu.qml"));

    SimKeyEvent *simKeyEvent = new SimKeyEvent(0, &app);

    viewer.showExpanded();
    return app.exec();

编辑: 我也尝试使用“这个”: QCoreApplication::postEvent(this, event);

【问题讨论】:

为什么不直接向线程正在运行的工作线程发送一个信号(例如,称为tabKeyPressed())? @JBL:你的意思是用信号和槽代替?如何一键按下,例如不使用事件机制的字符'A'? 好吧,您可以像现在一样创建事件,并将其作为参数传递给信号,即tabKeyPressed(QKeyEvent* evt),它映射到插槽handleKeyPressedEvent(QKeyEvent* evt)你的工人。 (注意:还有更具体的事件,如QMouseEventQKeyEvent)。 @JBL:事件对我来说是新的,并且还发送带有参数的信号,但是如果我通过 QObject::connect() 将 QKeyEvent 传递给应用程序,那么 GUI 是否会将其注册为选项卡?如果我将它发送到插槽,我仍然遇到同样的问题:如何以编程方式执行“Tab”? 以编程方式执行选项卡不是一回事。我建议您阅读有关信号和插槽的更多信息(这会很有帮助,因为它是 Qt 的一个突出特性)。另外,你应该在你的帖子中定义你的目标(模拟按键就像用户按下它,愚弄 Qt 对象认为他收到了这样的事件,其他?) 【参考方案1】:

有关此问题的答案,请参阅this 帖子。

代码sn-p:

bool MyWidget::event(QEvent *event)

     if (event->type() == QEvent::KeyPress) 
         QKeyEvent *ke = static_cast<QKeyEvent *>(event);
         if (ke->key() == Qt::Key_Tab) 
             // special tab handling here
             return true;
         
      else if (event->type() == MyCustomEventType) 
         MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);
         // custom event handling here
         return true;
     
     return QWidget::event(event);

【讨论】:

以上是关于将事件发布到 Qt GUI 线程以模拟按键的主要内容,如果未能解决你的问题,请参考以下文章

将 Qt GUI 拆分为多个线程用于 GUI、模拟和 OpenGL 是不是可行?

在 Qt GUI 事件线程中检测到“我正在运行”

Qt Main-Gui 和其他线程+事件循环

Qt入门教程QObject篇线程和QOBject

Qt入门教程QObject篇线程和QOBject

Qt 串口的 C++ 线程模式