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

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

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


 



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值