Как изменить цвет текста QProgressBar с его значением?

Я не знаю, как изменить цвет текста частично в прогресс-бар, когда его значение будет около 50%. Этот эффект происходит автоматически в прогресс-баре fusion style (рисунок ниже). Кто-нибудь знает как это делается ?

Fusion style progress bar

3 ответов


слишком ленив, чтобы написать рабочий пример кода, а тем более сделать скриншот. Даже для 50 повторений. : -)

однако вопрос был несколько интересным. Я понятия не имел, как можно сделать такой двухцветный текст. Поэтому я проверил: http://qt.gitorious.org/qt/qtbase/blobs/stable/src/widgets/styles/qfusionstyle.cpp Линия 1450ff (http://qt.gitorious.org/qt/qtbase/blobs/stable/src/widgets/styles/qfusionstyle.cpp#line1450).

    QRegion rightRect = rect;
    rightRect = rightRect.subtracted(leftRect);
    painter->setClipRegion(rightRect);
    painter->setPen(flip ? alternateTextColor : textColor);
    painter->drawText(rect,
                      bar->text,
                      QTextOption(Qt::AlignAbsolute|
                                   Qt::AlignHCenter|
                                   Qt::AlignVCenter));
    if (!leftRect.isNull()) 
    {
        painter->setPen(flip ? textColor : alternateTextColor);
        painter->setClipRect(leftRect);
        painter->drawText(rect,
                 bar->text,
                 QTextOption(Qt::AlignAbsolute|
                              Qt::AlignHCenter|
                              Qt::AlignVCenter));
    }

в основном тексте рисуется два раза в один и тот же прямоугольник. Каждый раз с соответствующей вырезкой. Легко, если знаешь как. :-)


С моей точки зрения, лучший и, вероятно, самый простой способ сделать это-изменить поддон для виджета QProgressBar:

    QPalette palette = progressBar->palette()
    palette.setColor(QPalette::Text, textColor)
    palette.setColor(QPalette::HighlightedText, textColor)
    progressBar->setPalette(palette)

вы можете использовать таблицу стилей в контейнер :

myMainWidget.setStyleSheet(QString("QProgressBar {color: red}"));