如何使用线程实例化多个 QApplication
Posted
技术标签:
【中文标题】如何使用线程实例化多个 QApplication【英文标题】:How to use threads to instantiating multiple QApplication 【发布时间】:2015-04-24 10:13:31 【问题描述】:我找到了防止app.exec()
阻塞主线程here的解决方案。
我尝试实现此功能,但出现以下错误:
WARNING: QApplication was not created in the main() thread.
QWidget: Cannot create a QWidget without QApplication
这是我的代码:
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?
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();
问题是,我正在类中初始化 QApplication,所以它应该可以工作...我确保它可以与主要不使用 QApplication 的单独测试一起工作:
int main(int argc, char *argv[])
PB::Init(argc, argv, 0);
此代码运行良好。所以只有当我添加线程时我才会得到这个错误。
【问题讨论】:
为什么你认为你需要两个 QApplications?如果您需要,QEventLoop 或 QThread::exec() 将提供事件循环。 我不需要 QApplication 只是为了能够构造一个 QWidget 吗?当我删除 QApplications 时,我收到QWidget: Must construct a QApplication before a QWidget
错误。
抱歉,Qt 小部件不支持多标题。 QWidget 必须在 QApplication 所在的单个(主)线程上创建。使用线程计算数据,并使用 Qt::QueuedConnection 信号将结果传递给主线程以在 GUI 上可视化。检查threaded mandelbrot example 关于主(GUI)和工作线程通信。
【参考方案1】:
您可以在不同的线程中创建QApplication
,但您应该在此线程中创建所有 GUI 类的对象,否则您会得到未定义的行为。 QApplication
是单例的,所以你不能在不同的线程中创建QApplication
的多个实例。
【讨论】:
一点:没有“主线程”这样的东西。您可以安全地在“非主”thead 中创建QApplication
,并且不会有 UB。但你说得对,QApplication
是单身人士。 @Justin 在创建 QApplication
的第二个实例时遇到问题。它不依赖于线程。请,修复你的答案。
@SaZ,谢谢,我修好了。您可以编辑我的英语 (=以上是关于如何使用线程实例化多个 QApplication的主要内容,如果未能解决你的问题,请参考以下文章