2013-11-20 86 views
0

當我做了一些繪圖工作時,Qt GUI被凍結。我想在此時顯示「正在加載..」消息框。我使用QThread,但我做不到。當GUI凍結時顯示帶QThread的QMessageBox

我的QThread類

myThread.cpp

#include "myThread.h" 
#include <QtCore> 

myThread::myThread(QObject *parent) : 
    QThread(parent) 
{ 
} 

void myThread::run() 
{ 
    emit threadSignal(); 
} 

myThread.h

#ifndef MYTHREAD_H 
#define MYTHREAD_H 

#include <QThread> 

class myThread : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit myThread(QObject *parent = 0); 
    void run(); 

signals: 
    void threadSignal(); 

public slots: 

}; 

我在主頭文件

public: 
    myThread *mess; 
    QMessageBox box; 

public slots: 
    void threadSlot(); 

我在主寫道寫cpp文件:

​​

在我的主要cpp文件中有一個凍結GUI的功能。

void Archive::plot() 
{ 
    mess->start(); 

    //heavy work. It takes 2-3 second and GUI become unresponsive. 

} 

我想那個線程首先啓動並顯示QmessageBox。 plot()函數結束後,QmessageBox消失。但是在plot()函數結束後顯示QmessageBox。爲什麼它的行爲如此呢?

我使用Qt 4.8.5

謝謝。

+1

如果所有繁重的工作都在主線程上完成,你的'myThread'對象的目的是什麼? – thuga

+0

我只想顯示一個帶有文本「Wait」的QMessageBox。如果我在主線程中執行此操作,QmessageBox在GUI凍結前不會出現。 – user4757345

+1

然後,您應該將繁重的工作移至您的'myThread'對象,並將GUI內容保留在主線程中,而不是反過來。 – thuga

回答

3

只能從主線程訪問Qt中的GUI類。

這個問題的官方解決方案是在不同的線程中完成繁重的工作,而不是讓GUI凍結。有關在Qt中使用線程的不同方式,請參閱https://doc.qt.io/qt-5/threads-technologies.html

警告:你應該添加插槽從QThread的派生類。從文檔(https://doc.qt.io/qt-5/qthread.html):

要記住,一個QThread的實例住在老 線程實例化它,而不是在新的線程調用run()中是非常重要的。 這意味着所有QThread的排隊插槽將在舊的 線程中執行。因此,希望調用新線程 中的插槽的開發人員必須使用工作對象方法;新的插槽不應直接實現到子類QThread中。

這些鏈接適用於Qt 5,但大多數概念也適用於Qt 4.8。