QT-在不阻止其GUI的情况下显示小部件

use*_*127 0 user-interface qt multithreading

我想显示一个小部件,用于显示动画加载的gif,而另一个函数(pthread)计算任务。

我试图用一个QThread类对我的窗口小部件进行子类化,并实现了run()我称之为method的方法show()。但是,我的窗口小部件GUI冻结了。

如何启动单独处理GUI的小部件?

The*_*ght 5

除主线程外,您不能在其他任何部件上运行小部件。

另外,除非您想更改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)