更改QProgressBar显示的文本

17
我使用 QProgressBar 来显示下载操作的进度。我想在显示的百分比上添加一些文本,例如:

10% (下载速度 kB/s)

有什么想法吗?

4个回答

33

使QProgressBar的文本可见。

QProgressBar *progBar = new QProgressBar();
progBar->setTextVisible(true);
显示下载进度。
void Widget::setProgress(int downloadedSize, int totalSize)
{
    double downloaded_Size = (double)downloadedSize;
    double total_Size = (double)totalSize;
    double progress = (downloaded_Size/total_Size) * 100;
    progBar->setValue(progress);

    // ******************************************************************
    progBar->setFormat("Your text here. "+QString::number(progress)+"%");
}

1
谢谢提醒关于 QMacStyle。避免我为了显示标签而苦恼。 - swdev
我尝试了这个,但在我的情况下不起作用。我已经设置了跑马灯进度条setRange(0,0),并将其显示在主窗口的状态栏中。这是因为我的进度条在状态栏中吗? - zar
@zadane 关于 QMacStyle 和更改为 CDE 等的问题 - 这是否可能?我已经阅读过,例如您不能在 Mac 平台之外使用 QMacStyle,据我所知,CDE、Cleanlooks 等是 Linux 主题,因此我根本不确定是否可能。 - rbaleksandar
@zar 不是的,那是因为你把范围限制在了 [0, 0]。进度条的格式仅仅旨在将当前进度的整数值插入到可读文本中。由于对于被限制在 [0, 0] 的进度条,这个值总是 0,Qt 隐式隐藏了这个文本,而不是显示类似于“0% 完成”的文本。(可以说,这是一件不好的事情。)一个常见的解决方法是将范围增加到 [0, 1],但这伴随着其自身的不良权衡。请参见此 StackOverflow 答案以获取相关讨论。 - Cecil Curry
1
实际上,这个代码:progBar->setFormat("Your text here. "+QString::number(progress)+"%"); 可以被替换为 progBar->setFormat("Your text here. %p%"); 因为 setFormat() 接受某种格式,其中 %p 是当前百分比,**%v** 是当前值,**%m** 是当前步数。 - IGR94
显示剩余3条评论

9
您可以自己计算下载速度,然后构造以下字符串:
QString text = QString( "%p% (%1 KB/s)" ).arg( speedInKbps );
progressBar->setFormat( text );

每次需要更新下载速度时,您都需要执行此操作。

4

我知道现在已经很晚了,但以防后人需要。从PyQT4.2开始,你可以直接使用setFormat方法。例如,要让它显示maxValue的currentValue (0 of 4),只需要这样:

yourprogressbar.setFormat("%v of %m")

3

由于Macintosh StyleSheet的QProgressBar不支持format属性,为了实现跨平台支持,可以添加一个带有QLabel的第二层。

    // init progress text label
    if (progressBar->isTextVisible())
    {
        progressBar->setTextVisible(false); // prevent dublicate

        QHBoxLayout *layout = new QHBoxLayout(progressBar);
        QLabel *overlay = new QLabel();
        overlay->setAlignment(Qt::AlignCenter);
        overlay->setText("");
        layout->addWidget(overlay);
        layout->setContentsMargins(0,0,0,0);

        connect(progressBar, SIGNAL(valueChanged(int)), this, SLOT(progressLabelUpdate()));
    }

void MainWindow::progressLabelUpdate()
{
    if (QProgressBar* progressBar = qobject_cast<QProgressBar*>(sender()))
    {
        QString text = progressBar->format();
        int precent = 0;
        if (progressBar->maximum()>0)
            precent = 100 * progressBar->value() / progressBar->maximum();
        text.replace("%p",  QString::number(precent));
        text.replace("%v", QString::number(progressBar->value()));
        QLabel *label = progressBar->findChild<QLabel *>();
        if (label)
            label->setText(text);
    }
}

你能再解释一下这段代码吗?我正在尝试用Python实现它,我的C++有点生疏!谢谢! - Tom Myddeltyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接