将事件发布到 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)
你的工人。 (注意:还有更具体的事件,如QMouseEvent
或QKeyEvent
)。
@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 线程以模拟按键的主要内容,如果未能解决你的问题,请参考以下文章