在Qt

时间:2018-03-23 06:10:27

标签: qt qmessagebox

我有一个程序,当它运行时,首先要求用户初始化系统。在该问题表单中,有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>");
            }
        }
    }

initializePlotsinitializeGraphsinitializeInterests类似。

问题从这里开始:

我希望在初始化后为每个人显示一条消息(正如我在initializeInterests中提到的那样),但我的initializeMBox(是QMessageBox)不会持续显示消息当所有人都被初始化时,所有消息都会突然显示。应该注意的是,我发现我的initializeMBox越来越大,但似乎我的QMessageBox已冻结。

我无法使用QtConcurrent::run,因为我的QMessageBox已从mainwindow(以及基本线程)更新了我提到的明星行。

如何让QMessageBox连续更新?

1 个答案:

答案 0 :(得分:2)

  1. 不要重新输入事件循环。将id->exec()替换为id->show()。管理对话框的生命周期 - 也许根本不应该动态创建。

  2. 请勿在{{1​​}}中阻止。不是更改组合框,而是获取其数据,将其发送到异步作业,在那里设置所有内容,然后将结果发回。

  3. 通过const引用传递容器,而不是值。

  4. 不要通过连接创建字符串。

  5. 如果输入人员列表很长,请对其进行排序以加快查找速度。

  6. 例如:

    initializeInterests

    您提到的“特定对象”的创建不应该访问gui线程中的任何内容。如果没有 - 传递所需数据的副本,或以线程安全的方式访问它。有时它是有意义的,而不是复制数据,将其移动到工作者,然后当工人完成时 - 通过lambda的方式将其移回gui。