QDialog节目不会立即发生

时间:2014-10-27 06:42:36

标签: qt

我有一个服务器客户端应用程序,并且在开始时客户端从服务器加载数据。我有一个对话框,显示从服务器获取数据的状态(有进度条)。但是当我调用该函数时,对话框出现时没有带有白色背景的内容,并突然变为已完成状态。

void SystemScreen::loadServerData()
{
    qDebug() << Q_FUNC_INFO << "Invoked";

    if (NULL != mpDataManagerDlg)
    {
        qDebug() << Q_FUNC_INFO << "show progres screen";
        mpDataManagerDlg->showScreen();
    }

    loadData();

    qDebug() << Q_FUNC_INFO << "Exits";
}

void SystemScreen::loadData()
{
    qDebug() << Q_FUNC_INFO << "Invoked";

    if (NULL != mpDataManager)
    {
        mpDataManager->loadDataFromServer();
    }

    qDebug() << Q_FUNC_INFO << "Exits";
}

我觉得只有在loadData()函数完成后才会显示对话框。有没有替代方法呢?

我用计时器启动

QTimer::singleShot(100, this, SLOT(loadData()));

但是我在获取数据时遇到了一些麻烦。如果我突然读到,数据就是空的。

编辑:

void DataManagerDialog::setDefault()
{
    qDebug() << Q_FUNC_INFO << "Invoked";
    setProgressBar(0);
    setProgressBarColor(false);

    ui->deptFailButton->hide();
    ui->deptOkButton->hide();
    ui->deptLabel->setStyleSheet("color:gray");
    ui->subGroupFailButton->hide();
    ui->subGroupOkButton->hide();
    ui->subGroupLabel->setStyleSheet("color:gray");
    ui->itemFailButton->hide();
    ui->itemOkButton->hide();
    ui->itemLabel->setStyleSheet("color:gray");
    ui->salesBtnFailButton->hide();
    ui->salesBtnOkButton->hide();
    ui->salesBtnLabel->setStyleSheet("color:gray");

    qDebug() << Q_FUNC_INFO << "Exits";
}

void DataManagerDialog::alignCenter()
{
    qDebug() << Q_FUNC_INFO << "Invoked";

    QWidget *par = parentWidget();
    if (par)
    {
        int x = width()/2;
        int y = height()/2;

        QPoint mid(mapToGlobal(QPoint(x, y)));

        int px = par->width()/2;
        int py = par->height()/2;

        QPoint parMid(mapToGlobal(QPoint(px, py)));

        move(parMid.x()-mid.x(), parMid.y()-mid.y());
    }

    qDebug() << Q_FUNC_INFO << "Exits";
}

void DataManagerDialog::showScreen()
{
    setDefault();
    alignCenter();
    show();
}

1 个答案:

答案 0 :(得分:2)

您可能不会进入事件循环。

尝试在mpDataManager-&gt; loadDataFromServer()中不时调用QCoreApplication::processEvents()来更新GUI。

来自processEvents文档:

  

当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此功能。

从评论

获得反馈后添加了编辑

更好的方法是使用状态信息在loadDataFromServer()方法中发送信号,并使用插槽监听信号并更新GUI。

这是一个说明这个想法的原型:

void mpDataManagerDlg::loadDataFromServer() {
    while(true) {
        // do some work
        int progress = // some value
        emit updateDialogSignal(progress);
    }
}

// in your dialog class
public slots:
void DataManagerDialog::updateDialog(int progress) {
    // update gui
}

有关信号和广告位的更多信息,请here