use*_*127 0 user-interface qt multithreading
我想显示一个小部件,用于显示动画加载的gif,而另一个函数(pthread)计算任务。
我试图用一个QThread类对我的窗口小部件进行子类化,并实现了run()我称之为method的方法show()。但是,我的窗口小部件GUI冻结了。
如何启动单独处理GUI的小部件?
除主线程外,您不能在其他任何部件上运行小部件。
另外,除非您想更改Qt处理线程的方式,否则您不应该从QThread继承。
而是创建一个从QObject继承的辅助对象,并将其移动到新线程。您可以在此处阅读如何真正使用QThread。
然后,您的工作对象可以移动到另一个线程,进行计算并通过信号和插槽与主线程上的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);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用信号和插槽控制线程。
// 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()));
Run Code Online (Sandbox Code Playgroud)
并启动线程:-
pThread->start();
Run Code Online (Sandbox Code Playgroud)
通过这种方式使用,还可以将多个对象移动到一个新线程中,而不是为每个对象实例创建一个新线程。
因此,例如,现在,例如,如果您想在工作对象中的处理过程中的某个时刻显示小部件,则您将发出其displayWidget()信号,并且之前已将其连接到小部件的show()插槽。
QWidget* pWidget = new QWidget(parent); // assumes parent is initialized
// using Qt 5 connect call
connect(pWorker, &Worker::displayWidget, pWidget, &Widget::show);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1855 次 |
| 最近记录: |