我有一个程序,当它运行时,首先要求用户初始化系统。在该问题表单中,有3个复选框,用户可以为特定人员或每个人检查它们,并且系统初始化与该人员的该复选框相关的项目。
选中复选框后,将调用特定函数,然后调用特定类,并完成初始化。
在mainwindow.cpp
我有:
InitializeDialog *id=new InitializeDialog;
connect(id,&InitializeDialog::initializeSignal,this,&MainWindow::initializeSlot);
id->exec();
id
是问题表单,其中包含3个复选框。和
void MainWindow::initializeSlot(QStringList persons, bool interests, bool plots, bool graphs)
{
initializeMBox->setWindowTitle(tr("Initializing System")+"...");
initializeMBox->setText(tr("Please wait until initialization has been done") + ".<br>");
initializeMBox->show();
initializeMBox->setStandardButtons(0);
if (interests)//checkbox 1 is checked
initializeInterests(persons);
if (plots)//checkbox 2 is checked
initializePlots(persons);
if(graphs)//checkbox 3 is checked
initializeGraphs(persons);
initializeMBox->setStandardButtons(QMessageBox::Ok);
}
再次:
void MainWindow::initializeInterests(QStringList persons)
{
for(int p=0;p<persons_comboBox_->count();p++)
{
persons_comboBox_->setCurrentIndex(p);
if (persons.contains(persons_comboBox_->currentText()))
{
//..
//create a specific class object and some specific functions
//..
//*
initializeMBox->setText(initializeMBox->text() + "<div><img src=\":/tickIcon.png\" height=\"10\" width=\"10\">" + " " + tr("Interests analyzed for the persons") + ": " + persons_comboBox_->currentText() + ".</div>");
}
}
}
initializePlots
和initializeGraphs
与initializeInterests
类似。
问题从这里开始:
我希望在初始化后为每个人显示一条消息(正如我在initializeInterests
中提到的那样),但我的initializeMBox
(是QMessageBox
)不会持续显示消息当所有人都被初始化时,所有消息都会突然显示。应该注意的是,我发现我的initializeMBox
越来越大,但似乎我的QMessageBox
已冻结。
我无法使用QtConcurrent::run
,因为我的QMessageBox
已从mainwindow
(以及基本线程)更新了我提到的明星行。
如何让QMessageBox
连续更新?
答案 0 :(得分:2)
不要重新输入事件循环。将id->exec()
替换为id->show()
。管理对话框的生命周期 - 也许根本不应该动态创建。
请勿在{{1}}中阻止。不是更改组合框,而是获取其数据,将其发送到异步作业,在那里设置所有内容,然后将结果发回。
通过const引用传递容器,而不是值。
不要通过连接创建字符串。
如果输入人员列表很长,请对其进行排序以加快查找速度。
例如:
initializeInterests
您提到的“特定对象”的创建不应该访问gui线程中的任何内容。如果没有 - 传递所需数据的副本,或以线程安全的方式访问它。有时它是有意义的,而不是复制数据,将其移动到工作者,然后当工人完成时 - 通过lambda的方式将其移回gui。