【发布时间】: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)和工作线程通信。
标签: c++ multithreading qt user-interface qapplication