你不能让小部件在除主线程之外的任何东西上运行。
另外,除非你想改变 Qt 处理线程的方式,否则你不应该从 QThread 继承。
相反,创建一个从 QObject 继承的工作对象并将其移动到新线程。你可以阅读how to really use QThread here。
然后您的工作对象可以移动到另一个线程,进行计算并通过信号和插槽与主线程上的 Gui 小部件进行通信。
例如,下面是一个工人阶级的简要概述:-
class Worker : public QObject
{
Q_OBJECT
signals:
void finished();
void displayWidget();
private slots:
void run();
}
QThread pThread = new QThread;
Worker pObject = new Worker;
// move the pObject to the thread
pObject->moveToThread(pThread);
然后您可以使用信号和槽来控制线程。
// assuming you've added a run slot function to the Consumer class
connect(pThread, SIGNAL(started()), pObject, SLOT(run()));
connect(pObject, SIGNAL(finished()), pThread, SLOT(quit()));
connect(pObject, SIGNAL(finished()), pObject, SLOT(deleteLater()));
// Note the thread cleans itself up here, but if the app is quitting,
// waiting on the thread to finish may be required instead
connect(pThread, SIGNAL(finished()), pThread, SLOT(deleteLater()));
并启动线程:-
pThread->start();
使用这种方式,它还可以将多个对象移动到一个新线程,而不是为每个对象实例创建一个新线程。
所以现在,例如,如果您想在工作对象处理期间的某个时间点显示一个小部件,您将发出它的 displayWidget() 信号,之前已将它连接到小部件的 show() 插槽。
QWidget* pWidget = new QWidget(parent); // assumes parent is initialized
// using Qt 5 connect call
connect(pWorker, &Worker::displayWidget, pWidget, &Widget::show);