[英]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.