如何使用线程实例化多个QApplication

Jus*_*ang 1 c++ user-interface qt multithreading qapplication

我找到了一种解决方案,以防止app.exec()这里阻塞主线程。

我尝试实现此功能,但出现以下错误:

WARNING: QApplication was not created in the main() thread.
QWidget: Cannot create a QWidget without QApplication
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

PB是具有静态函数的类,该函数可初始化GUI。

pb.cpp:

bool PB::Init(int argc, char *argv[],
        int ID) {

    QApplication app(argc, argv);
    PB PB(ID); // The constructor creates an instance of the pushbutton qt object
    app.exec();
    return true; // Do I even need this because app.exec() runs an infinite loop right?

}
Run Code Online (Sandbox Code Playgroud)

main.cpp:

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

    std::thread first(&PB::Init, argc, argv, 0);
    std::thread second(&PB::Init, argc, argv, 1);

    first.join();
    second.join();

}
Run Code Online (Sandbox Code Playgroud)

问题是,我正在类中初始化QApplication,因此它应该可以工作...我确保它可以与单独的测试一起使用,而在主测试中不使用QApplication:

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

    PB::Init(argc, argv, 0);

}
Run Code Online (Sandbox Code Playgroud)

此代码可以正常工作。因此,只有在添加线程时才会出现此错误。

gom*_*ons 5

您可以QApplication在其他线程中创建,但是您应该在该线程中创建所有GUI类的对象,否则会出现未定义的行为。QApplication是单例的,因此您不能QApplication在不同的线程中创建多个实例。