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