QProgressBar заблокирован основным потоком?
================================================== =====
QProgressBar* pbar = new QProgressBar(this);
pbar->setMinimum(0);
pbar->setMaximum(0);
pbar->show();
for (int i = 0; i < 10000; i++) {
qDebug() << "=====flag1======";
}
pbar->close();
================================================== =========
Я хочу, чтобы ProgressBar показывал занятое, когда сообщение qDebug(), но эффекта нет, QProgressBar был заблокирован и закрыт после завершения цикла.
кто-нибудь знает, как решить эту проблему? благодарю вас!
3 ответа
Да, GUI заблокирован, 10 000 много времени. Используйте QThread http://doc.qt.io/qt-4.8/qthread.html.
void My_Thread::run() {
for (int i = 0; i < 1e4; i++) {
if (i % 100 == 0) {
emit UpdateProgressBar(i);
}
}
}
//In Your SLOT
void MainWindow::UpdateProgressbar(int value) {
ui->progressbar->setValue(value);
}
Основные потоки блокируются циклом до появления пользовательского интерфейса, а интерфейс обновляется сразу после окончания цикла. Если вы хотите увидеть индикатор выполнения, вы можете добавить QApplication::processEvents(); внутри петли. Это не лучшее решение, но оно будет работать.
Чтобы позволить любому виджету появляться, необходимо обработать цикл обработки событий. Поскольку у вас есть полный контроль над основным потоком, его цикл обработки событий не может обрабатывать события, которые будут отображаться и обновляться. QProgressBar
,
Один из способов исправить, если это быстро, но лечение - это добавить к вашей петле QApplication::processEvents();
который обрабатывает события цикла событий.
Ofcaource вы также должны позвонить bar->setValue(i);
,
Правильный способ сделать это - асинхронное программирование, которое использует сигналы и слоты. Вы не предоставили каких-либо подробностей о вашей реальной проблеме, поэтому не можете найти хорошее решение.