我正在从线程调用QProgressDialog,即使将setModal设置为true,也无法将其作为模式窗口。我希望在执行QProgressDialog时阻止主窗口。
以下是我的代码。
GenericFunc.h
QProgressDialog *progressBarDialog;
GenericFunc.cpp
void GenericFunc::testSlot()
{
int numTasks = 4500;
progressBarDialog = new QProgressDialog("Task in progress.", "Cancel", 0, numTasks);
progressBarDialog->setWindowModality(Qt::WindowModal);
progressBarDialog->setModal(true);
progressBarDialog->exec();
}
答案 0 :(得分:2)
QProgressDialog类是GUI类。您无法在辅助线程中实例化该对象。
http://doc.qt.io/qt-5/thread-basics.html#gui-thread-and-worker-thread
GUI线程和辅助线程
如上所述,每个程序在启动时都有一个线程。这个 线程被称为“主线程”(也称为“ GUI线程” Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和 几个相关的类(例如QPixmap)在辅助类中不起作用 线程。辅助线程通常称为“工人” 线程”,因为它用于从主服务器上分担处理工作 线程。
使用信号插槽将进度数据从工作线程传递到gui线程。
另一个问题是,您将其设置为WindowModal,但是此progressBarDialog
没有任何父项,因此它不会阻塞任何父项窗口链。