1

我想QProgressBar在以下函数中使用 a:

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

}

我希望进度条用作等待条(最初;稍后将使用计时器实现)并在完成后完成(在 100 处完成)QProcess。我得到一个空白的黑屏process_install->waitForFinished(-1)。我尝试了很多选择,但都是徒劳的,虽然QProgressDialog效果很好。请帮助我哪里出了错,我该怎么办。

4

1 回答 1

0

当您 时waitForFinished,您正在阻塞 GUI 线程,因此进度对话框永远不会获取事件,因此永远不会绘制。您需要安排事件循环定期运行 - 类似于(未经测试):

process_install->start(program_install);

do {
    qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
} while (process_install->waitForFinished(20)); //  1/50 second

ui->nextButton->setEnabled(true);

connect(process_install, SIGNAL(...), ...) 顺便说一句,在之前 process_install->start避免竞争条件是个好主意。不太可能需要一个进度表,但仍然是一个好习惯。:-)

于 2015-06-25T18:05:58.190 回答