C++ 将事件发布到Qt GUI线程以模拟按键
我想在Qt中模拟按键。我在网上找到了一些例子,但还没有成功。我有这个方法:C++ 将事件发布到Qt GUI线程以模拟按键,c++,qt,events,C++,Qt,Events,我想在Qt中模拟按键。我在网上找到了一些例子,但还没有成功。我有这个方法: void SimKeyEvent::pressTab() { QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier); QCoreApplication::postEvent(receiver, event); } 我不知道如何正确处理GUI线程,它应该是上面代码行中的“接收者”。我尝试的是传递“
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:
SimKeyEvent *simKeyEvent = new SimKeyEvent(0, &app);
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(此,事件) 有关此问题的答案,请参阅帖子
代码段:
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);
}
boolmywidget::事件(QEvent*event)
{
如果(事件->类型()==QEvent::按键){
QKeyEvent*ke=静态施法(事件);
如果(ke->key()==Qt::key_选项卡){
//这里的特殊标签处理
返回true;
}
}else if(事件->类型()==MyCustomEventType){
MyCustomEvent*myEvent=static_cast(事件);
//这里的自定义事件处理
返回true;
}
返回QWidget::事件(event);
}
为什么不向线程正在运行的工作线程发送一个信号(例如称为tabKeyPressed()
)呢?@JBL:您的意思是使用信号和插槽?如何在不使用事件机制的情况下按下字符“A”?您可以像现在一样创建事件,并将其作为参数传递给信号,即tabKeyPressed(QKeyEvent*evt)
,它映射到您工作人员的插槽handleKeyPressedEvent(QKeyEvent*evt)
。(注意:还有更具体的事件,例如QMouseEvent
或QKeyEvent
)@JBL:Events对我来说是新的,并且还发送带有参数的信号,但是如果我通过QObject::connect()将QKeyEvent传递给应用程序,GUI会将其注册为选项卡吗?如果我将它发送到插槽,我仍然有相同的问题:如何以编程方式执行“选项卡”?以编程方式执行选项卡不是一回事。我建议您多读一些关于信号和插槽的内容(这会很有帮助,因为这是Qt的一个突出特性)。此外,你应该在帖子中定义你的目标(模拟按键,就像用户按下它一样,愚弄一个Qt对象,以为他收到了这样的事件,其他?)