如何从模型中的函数显示进度条?

时间:2015-02-11 16:34:35

标签: c++ qt progress-bar

我的export()派生类中有函数QFileSystemModel。现在我想显示进度条,因为此功能可以正常工作。我很明显不想从那里弹出QProgressDialog,因为GUI应该是单独的。

void MainWindow::on_pushButtonConvert_clicked()
{
    QString rootPath = ui->lineEditSourceFolder->text();

    QString destPath = ui->lineEditDestFolder->text();

    dirModel->convert(rootPath, destPath); // dirModel is QFileSystemModel derived member variable
}

在将convert()移至模型之前,它位于我的MainWindow课程中。这个函数本身就是创建QProgressDialog但现在转移到模式后,应该禁止它创建它,以便在哪里创建进度?

我从另一篇帖子中得到一个提示,我应该使用信号和插槽,但是这里有什么用?

1 个答案:

答案 0 :(得分:1)

您应该将dirModel移动到新线程,以防止export()阻止主线程和UI。这可以这样做:

QThread * th = new QThread();
dirModel->moveToThread(th);

QObject::connect(th,SIGNAL(started()),dirModel,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),dirModel,SLOT(OnFinished()));

th->start();

dirModel中的初始化和终止任务应分别在OnStarted()OnFinished()个广告位中完成。

您应该使用班级中的信号通知用户界面中进度条的进度值。在export()函数中,您应该使用适当的值发出信号。信号如下:

void progressChanged(int val);

您还应该将progressChanged(int)信号连接到setValue(int value)的{​​{1}}位置。

最后一点是,当它在另一个线程中时,你不应该直接调用QProgressBar。正确的方法是将export()定义为一个插槽,并将信号连接到该插槽,并在您想要呼叫export()时发出信号。