Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将事件发布到Qt GUI线程以模拟按键_C++_Qt_Events - Fatal编程技术网

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

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线程,它应该是上面代码行中的“接收者”。我尝试的是传递“

我想在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:

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对象,以为他收到了这样的事件,其他?)