簡體   English   中英

忙模式下的 QProgressDialog 不更新

[英]QProgressDialog in Busy Mode Does Not Update

我有一個簡單的循環,我正在執行不確定長度的操作。 我設置了一個range(0,0)的 QProgressDialog 以觸發其不確定的“忙碌”模式; 在我的平台上,這通常會產生一個進度條,其手柄來回彈跳。 但是,即使精簡到以下內容,對話框也會出現,響應“取消”按鈕,但手柄在欄的末尾被凍結在原位並且不會循環。

    QProgressDialog* progressDialog =
                     new QProgressDialog("My Progress", "Cancel",
                                         0, 0, this);
    progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
    progressDialog->setModal(true);
    progressDialog->setMinimumDuration(0);
    progressDialog->show();
    progressDialog->setValue(0);
        
    while (!done)
    {
        QThread::msleep(200);
        QCoreApplication::processEvents();
    }

顯然,循環內部實際發生了更多的事情,但無論有沒有內容,它的行為都是一樣的; 注釋掉其他所有內容后剩下的內容與描述的一樣。

為什么我的進度句柄不來回彈跳?

您的問題不是QProgressDialog問題,而是線程問題。

您正在同一線程中運行進度條和“作業” - 您的 GUI 線程。 我所說的“工作”是循環內的所有內容,並且被認為是模擬“忙碌”模式,因為在實際情況下它應該需要很長時間。 因此,當線程在睡眠時“忙碌”時,您的 GUI 不會像在同一線程中那樣移動。

您應該使用線程(或 QThread)來啟動作業,以允許 GUI 自行在 GUI 線程中運行。

這是從“所有”代碼(或幾乎)復制的示例,並且忙碌欄確實顯示正確。

#include <QApplication>
#include <QProgressDialog>
#include <QThread>

void job()
{
    bool done =true;
    while (!done)
    {
        QThread::msleep(1000);
        QApplication::processEvents();
    }
}

int main(int argc, char *argv[])
{

    bool done = false;
    QApplication a(argc, argv);
    QProgressDialog* progressDialog = new QProgressDialog("My Progress", "Cancel",

                                         0, 0, nullptr);
    progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);
    progressDialog->setModal(true);
    progressDialog->setMinimumDuration(0);
    progressDialog->show();
    progressDialog->setValue(0);

    QThread* thread = QThread::create(job);
    thread->start();

    return a.exec();
}

這是繁忙欄的結果(它會根據您的需要向后移動和第四個移動)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM