我的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
但现在转移到模式后,应该禁止它创建它,以便在哪里创建进度?
我从另一篇帖子中得到一个提示,我应该使用信号和插槽,但是这里有什么用?
答案 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()
时发出信号。