【发布时间】: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 对象认为他收到了这样的事件,其他?)