2015-02-11 60 views
2

我有我的QFileSystemModel派生類中的函數export()。現在我想顯示進度條,因爲這個功能起作用。由於GUI應該是獨立的,因此我不想從那裏彈出QProgressDialog如何從模型中的函數顯示進度條?

void MainWindow::on_pushButtonConvert_clicked() 
{ 
    QString rootPath = ui->lineEditSourceFolder->text(); 

    QString destPath = ui->lineEditDestFolder->text(); 

    dirModel->convert(rootPath, destPath); // dirModel is QFileSystemModel derived member variable 
} 

之前移動convert()模型,它在我MainWindow類。此功能本身創建QProgressDialog,但現在轉到模式後,應禁止創建它,所以我在哪裏創建進度?

我從另一篇文章中得到了一個提示,我應該使用信號和插槽,但在這裏如何?

回答

1

您應該將dirModel移動到新線程以防止export()阻止主線程和UI。這可以像做:

QThread * th = new QThread(); 
dirModel->moveToThread(th); 

QObject::connect(th,SIGNAL(started()),dirModel,SLOT(OnStarted())); 
QObject::connect(th,SIGNAL(finished()),dirModel,SLOT(OnFinished())); 

th->start(); 

你的初始化和終止任務dirModelOnStarted()OnFinished()插槽分別進行。

您應該在班級中使用信號來通知用戶界面中進度條的進度值。在您的export()函數中,您應該發出具有適當值的信號。該信號是這樣的:

void progressChanged(int val); 

你也應該在progressChanged(int)信號連接到QProgressBarsetValue(int value)插槽。

最後一點是,當它在另一個線程中時,不應該直接調用export()。正確的方法是將export()定義爲一個插槽,並將一個信號連接到該插槽,並在您要撥打export()時發出信號。

+0

謝謝,我認爲這可以解決我面臨的其他問題,如我的互聯網連接在前一天,應用程序將無法啓動很長一段時間,因爲它無法找到映射的驅動器。 – zar 2015-02-11 16:59:48