1. 程式人生 > >Qt: 進度對話方塊的使用

Qt: 進度對話方塊的使用

           在執行長時間任務時,如果沒有進度條,使用者很難把握任務完成進度,而且如果耗時太長或誤操作 沒有進度條就無法取消任務。對於GUI程式,還會導致主介面假死現象。所以對於一個長時間任務 新增一個進度條是很有必要的。在Qt中提供了QProgressDialog和QProgressBar兩種方式提示進度。因為之前在專案中用了進度對話方塊。在這裡簡單整理一下進度對話方塊的使用。

     進度對話方塊也是分為模態和非模態兩種,使用模態對話方塊對GUI程式來說就避免了假死現象。但缺點在任務完成之前不可以使用介面。模態對話方塊的話,可以將任務丟進一個執行緒裡,這樣也避免了介面假死。這樣做缺點:介面操作可能不會很流暢,而你的長時間任務因為線上程執行會耗時更長。選擇模態還是非模態要根據自己實際需求來定。

    在Qt文件中給出了進度對話方塊使用的兩個例子:第一個例子是可以獲取任務總量的情況。

  QProgressDialog progress("Copying files...", "Abort Copy", 0, numFiles, this);
    progress.setWindowModality(Qt::WindowModal);

    for (int i = 0; i < numFiles; i++) {
        progress.setValue(i);

        if (progress.wasCanceled())
            break;
        //... copy one file
    }
    progress.setValue(numFiles);
 

  第二個例子是不知道任務總量,我們就自己給對話方塊進度條設定一個範圍值 然後再將自己的任務量化到這個範圍之內

// Operation constructor
Operation::Operation(QObject *parent)
    : QObject(parent), steps(0)
{
    pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100);
    connect(pd, SIGNAL(canceled()), this, SLOT(cancel()));
    t = new QTimer(this);
    connect(t, SIGNAL(timeout()), this, SLOT(perform()));
    t->start(0);
}

void Operation::perform()
{
    pd->setValue(steps);
    //... perform one percent of the operation
    steps++;
    if (steps > pd->maximum())
        t->stop();
}

void Operation::cancel()
{
    t->stop();
    //... cleanup
}

幾個重要的成員函式:

  setValue():設定當前進度值;

  setAutoClose(bool); 當進度條重置時候,是否是隱藏狀態  如果想要一根進度條顯示一個任務的多個子任務的執行進度 那再重置時要設定該選項 不要隱藏。

  wasCancel();  取消按鈕的槽函式