Qt Stylesheet:控制进度条文本高亮颜色?

Qt Stylesheet: Controlling progressbar text highlight color?

上下文

我正在使用 Qt 样式表在我的 UI 中自定义 QProgressBar。我有一个对比鲜明的主题,如下所示:

我通过我的样式表控制它:

QProgressBar {
    color: #FFFFFF;               /* Text color (not highlighted)
    border: 2px solid white;      /* Border color */
    border-radius: 5px;           /* Rounded border edges */
    margin-left: 24px;
    margin-right: 24px;           
    text-align: center            /* Center the X% indicator */
}

QProgressBar::chunk {
    color: #204a87;               /* Highlighted text color!? Not working */
    background-color: #FFFFFF;    /* Color of the 'completed' bar */
}

问题

不幸的是,我发现自己无法更改突出显示的进度文本颜色,一旦它被进度条本身遮住或覆盖。

这个可以在上面看到

解决方案

我试过是否可以为文本设置 高亮显示 属性。我知道我可以从调色板 可以 设置对比突出显示颜色,一旦进度条覆盖它,进度文本标签就会切换颜色。但是,我在此处

找不到如何访问 属性
QProgressBar::text::highlighted {
    color: #204a87; /* Doesn't do anything */ 
}

我还尝试将颜色 属性 添加到 QProgressBar::chunk,如上所示。这也没有做任何事情。

如何在样式表中设置进度条标签的对比高亮颜色?我一直主要在 this Qt resource 寻找指导,但它不包括这种情况。

这是我自己的结论,可能会有更好的答案。

根据 progress bar's customization documentation, it seems that only border, chunk, and text-align can be customized using style sheets. Even adding selection-color 不起作用,因为实际上没有选择文本。

在尝试 this question 中的解决方案后,我得出的结论是

  1. Qt 使用 painter 在进度条中突出显示文本,而不是在样式表中
  2. 对样式表的任何更改都将覆盖画家

不过,如果你愿意妥协,也有一个解决方案,使用QPalette和如下的融合风格

#include "mainwindow.h"

#include <QStyleFactory>
#include <QProgressBar>
#include <QSlider>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget *central_widget = new QWidget{this};
    this->setCentralWidget(central_widget);

    QProgressBar *progress_bar = new QProgressBar{central_widget};
    progress_bar->setRange(0, 100);
    progress_bar->setValue(0);
    progress_bar->setStyle(QStyleFactory::create("fusion"));
    QSlider *slider = new QSlider{central_widget};
    slider->setRange(0, 100);
    slider->setValue(0);
    slider->setOrientation(Qt::Orientation::Horizontal);
    connect(slider, &QSlider::valueChanged, progress_bar, &QProgressBar::setValue);

    QVBoxLayout *layout = new QVBoxLayout{central_widget};
    layout->addWidget(progress_bar);
    layout->addWidget(slider);

    QPalette palette = progress_bar->palette();
    palette.setColor(QPalette::Text, QColor::fromRgb(QRgb{0xFFFFFF})); // text, not highlight
    palette.setColor(QPalette::HighlightedText, QColor::fromRgb(QRgb{0x204a87})); // text, highlight
    palette.setColor(QPalette::Base, QColor::fromRgb(QRgb{0x0000FF})); // background, not highlight
    palette.setColor(QPalette::Highlight, QColor::fromRgb(QRgb{0xFFFFFF})); // background, highlight
    progress_bar->setPalette(palette);
}

MainWindow::~MainWindow()
{

}

融合样式使文本在进度条中居中。可以使用 QPalette 更改文本和背景颜色,但您将放弃更改边距、边框大小、边框颜色、边框半径和其他属性。