QProgressBar(Qt 5.4.0)产生黑屏
QProgressBar (Qt 5.4.0) produces black blank screen
我想在以下函数中使用 QProgressBar
:
void InstallingWindow::install_package(QString pkgname, QString tempdir){
qDebug() << "Imported tempdir is " + tempdir;
QFile ee_script("/usr/bin/ee_script");
QString program_install = "sudo /usr/bin/ee_script " + pkgname + " " + tempdir + " install";
if (!ee_script.exists()){
qDebug() << "Install script does not exists";
ee_script.error();
}
else{
process_install->start(program_install);
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(0);
connect(process_install, SIGNAL(finished(int, QProcess::ExitStatus)), ui->progressBar, SLOT(show_progress_bar()));
process_install->waitForFinished(-1); //this will make the screen blank
ui->progressBar->setMaximum(0);
ui->progressBar->setValue(100);
ui->nextButton->setEnabled(true);
}
post_install();
}
void InstallingWindow::show_progress_bar(){
ui->progressBar->setMaximum(100);
ui->progressBar->setValue(100);
ui->nextButton->setEnabled(true);
}
我希望进度条用作等待条(最初;稍后将使用计时器实现)并在 QProcess
完成后完成(在 100 处完成)。我得到一个空白的黑屏 process_install->waitForFinished(-1)
。
我尝试了很多选项,但都是徒劳的,而 QProgressDialog
工作正常。请帮我看看哪里出了问题,我该怎么办。
当您 waitForFinished
时,您正在阻塞 GUI 线程,因此进度对话框永远不会获取事件,因此永远不会绘制。您需要定期将事件循环安排为 运行 - 类似于 (untested):
process_install->start(program_install);
do {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
} while (process_install->waitForFinished(20)); // 1/50 second
ui->nextButton->setEnabled(true);
顺便说一句,在 process_install->start
之前 connect(process_install, SIGNAL(...), ...)
是个好主意,以避免竞争条件。不太可能需要进度表的过程,但仍然是一个需要养成的好习惯。 :-)
我想在以下函数中使用 QProgressBar
:
void InstallingWindow::install_package(QString pkgname, QString tempdir){
qDebug() << "Imported tempdir is " + tempdir;
QFile ee_script("/usr/bin/ee_script");
QString program_install = "sudo /usr/bin/ee_script " + pkgname + " " + tempdir + " install";
if (!ee_script.exists()){
qDebug() << "Install script does not exists";
ee_script.error();
}
else{
process_install->start(program_install);
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(0);
connect(process_install, SIGNAL(finished(int, QProcess::ExitStatus)), ui->progressBar, SLOT(show_progress_bar()));
process_install->waitForFinished(-1); //this will make the screen blank
ui->progressBar->setMaximum(0);
ui->progressBar->setValue(100);
ui->nextButton->setEnabled(true);
}
post_install();
}
void InstallingWindow::show_progress_bar(){
ui->progressBar->setMaximum(100);
ui->progressBar->setValue(100);
ui->nextButton->setEnabled(true);
}
我希望进度条用作等待条(最初;稍后将使用计时器实现)并在 QProcess
完成后完成(在 100 处完成)。我得到一个空白的黑屏 process_install->waitForFinished(-1)
。
我尝试了很多选项,但都是徒劳的,而 QProgressDialog
工作正常。请帮我看看哪里出了问题,我该怎么办。
当您 waitForFinished
时,您正在阻塞 GUI 线程,因此进度对话框永远不会获取事件,因此永远不会绘制。您需要定期将事件循环安排为 运行 - 类似于 (untested):
process_install->start(program_install);
do {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
} while (process_install->waitForFinished(20)); // 1/50 second
ui->nextButton->setEnabled(true);
顺便说一句,在 process_install->start
之前 connect(process_install, SIGNAL(...), ...)
是个好主意,以避免竞争条件。不太可能需要进度表的过程,但仍然是一个需要养成的好习惯。 :-)