Изменить текст в QProgressBar - PullRequest
       35

Изменить текст в QProgressBar

12 голосов
/ 15 декабря 2011

Ну, у меня есть QProgressBar, где я показываю прогресс загрузки, однако я хочу установить, где он показывает процент скорости загрузки, оставляя его как:

Процент% (скорость загрузки КБ / с)

Есть идеи?

Ответы [ 3 ]

23 голосов
/ 15 декабря 2011

делает текст 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)+"%");
}
8 голосов
/ 15 декабря 2011

Вы можете сами рассчитать скорость загрузки, а затем построить строку следующим образом:

QString text = QString( "%p% (%1 KB/s)" ).arg( speedInKbps );
progressBar->setFormat( text );

Однако вам придется делать это каждый раз, когда требуется обновить скорость загрузки.

2 голосов
/ 02 марта 2015

Поскольку QProgressBar для Macintosh StyleSheet не поддерживает свойство 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);
    }
}
...