QProgressDialong是Qt提供的用于显示各类耗时较长的操作进度,
而不至于让程序看上去假死了一样,他继承自QDialog。
example:http://doc.qt.io/qt-4.8/qprogressdialog.html#labelText-prop
但是在测试中会出现Dialog不显示,程序依旧进入假死状态,在网上也查阅不到问题所在。
不显示的原因是QProgressDialog有一个智能延迟,默认一切短于4秒的操作都不显示Dialog,因为测试时的数据量往往很小,从而导致了问题。
文档是这么说的:
A common problem with progress dialogs is that it is difficult to know when to use them; operations take different amounts of time on different hardware.QProgressDialog offers a solution to this problem: it estimates the time the operation will take (based on time for steps), and only shows itself if that estimate is beyondminimumDuration() (4 seconds by default).
所以只要使用
void setMinimumDuration(int ms)
将这个值改小或者为0,就可以了。下面是代码:
void MainWindow::sendAll()
{
int count = 0;
for(unsigned int i=0;i<ARRAY.size();i++)
{
count+=ARRAY.at(i).size();
}
int num = 0;
QProgressDialog progress_dialog("Sending values to Units...","Cancel",0,count,this);
progress_dialog.setWindowModality(Qt::WindowModal);
progress_dialog.setMinimumDuration(0);
progress_dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
progress_dialog.setFixedSize(500,120);
progress_dialog.setWindowTitle("Sending values to Units...");
for(unsigned int m = 0; m<ARRAY.size();m++)
{
int i = 0;
QString ip = "";
QString port = "";
QString unit_id = "";
while(ui->activeUnitWidget->item(m)->text()[i]!=':')
{
ip.append(ui->activeUnitWidget->item(m)->text()[i]);
i++;
}
i++;
while(ui->activeUnitWidget->item(m)->text()[i]!='[')
{
port.append(ui->activeUnitWidget->item(m)->text()[i]);
i++;
}
i++;
while(ui->activeUnitWidget->item(m)->text()[i]!=']')
{
unit_id.append(ui->activeUnitWidget->item(m)->text()[i]);
i++;
}
vector<addr_value>::iterator innerIter;
for(innerIter=ARRAY.at(m).begin(); innerIter!=ARRAY.at(m).end() ; innerIter++)
{
progress_dialog.setLabelText("Sending values to.."+ui->activeUnitWidget->item(m)->text());
M_Client A(ip.toLatin1(),port.toInt(),unit_id.toInt());
A.Connect();
A.Modbus_sender_single(num, innerIter->addr , innerIter->value);
A.Close();
progress_dialog.setValue(++num);
//Sleep(40);
}
}
}

QProgressDialog在Qt中用于显示耗时操作进度,避免程序假死。然而,当操作时间小于4秒时,对话框可能不会显示。这是因为QProgressDialog有一个智能延迟机制。通过设置setMinimumDuration(0),可以确保对话框在任何耗时操作时都能显示。
1673

被折叠的 条评论
为什么被折叠?



