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);,

Правильный способ сделать это - асинхронное программирование, которое использует сигналы и слоты. Вы не предоставили каких-либо подробностей о вашей реальной проблеме, поэтому не можете найти хорошее решение.

Другие вопросы по тегам