QProgressDialog使用时不显示的可能问题 #Qt #C++

来源:互联网 发布:日本尼达利淘宝店 编辑:程序博客网 时间:2024/06/03 21:20

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);        }    }}





0 0