Qt 如何正确连接QProgressBar与QFutureWatcher?
我希望函数的进度显示在progressBar上。按照指南,我写了下面的代码。但在函数执行期间,程序冻结,然后进度条的值变为1 程序本身不会产生错误。功能的结果是正确的 我想我的问题是,我不知道如何将函数的进度值与进度条的值联系起来 (表格h) (Form.cpp)按钮上的函数单击()Qt 如何正确连接QProgressBar与QFutureWatcher?,qt,Qt,我希望函数的进度显示在progressBar上。按照指南,我写了下面的代码。但在函数执行期间,程序冻结,然后进度条的值变为1 程序本身不会产生错误。功能的结果是正确的 我想我的问题是,我不知道如何将函数的进度值与进度条的值联系起来 (表格h) (Form.cpp)按钮上的函数单击() 问题是您正在立即调用future.result()。问题是result()将等待QFuture完成 Qt文档说(): 如果结果不立即可用,此函数将阻塞并等待结果可用 解决方案是将插槽连接到QFutureWatche
问题是您正在立即调用
future.result()
。问题是result()
将等待QFuture
完成
Qt文档说():
如果结果不立即可用,此函数将阻塞并等待结果可用
解决方案是将插槽连接到QFutureWatcher::finished()
:
auto*watcher=新的QFutureWatcher(此);
连接(watcher,&QFutureWatcher::finished,this,[=](){
自动结果=观察者->结果();
//对结果做点什么
//重要提示:再次删除观察者
watcher->deleteLater();
});
//现在开始任务
QString message=ui->textEdit->toPlainText();
watcher->setFuture(QtConcurrent::run(myObject,&myObject::longFunction,message));
removeQBitArray bitresult=future.result()代码>主题:您应该考虑使用新的连接语法:<代码> Connect(& FuturayWalter,QPutuxWaltHe::PrrassValueEffect,UI -PrimeStBar,QPrimeStBar::StValk);<代码>它有编译时检查。对于即将推出的Qt6,您还可以使用future.then([](){})代码>。这稍微容易一点,但需要Qt 6。正如他所说的“我认为我的问题是我不知道如何将函数的进度值与进度条的值联系起来。”他的问题是将FutureWatcher的信号连接到他的进度条以指示进度。而不是阅读结果。如果等待到完成,则无法在方法执行过程中更新进度条。
public:
MyObject object;
QFutureWatcher<QBitArray> FutureWatcher;
QFuture<QBitArray> future;
ui->setupUi(this);
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(100);
connect(&this->FutureWatcher, SIGNAL(progressValueChanged(int)), ui->progressBar, SLOT(setValue(int)));
void Form::on_button_clicked()
{
QString message = ui->textEdit->toPlainText();
future = QtConcurrent::run(&this->object, &MyObject::longFunction, message);
this->FutureWatcher.setFuture(future);
QBitArray bitresult = future.result();
}