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 中的解决方案后,我得出的结论是
- Qt 使用 painter 在进度条中突出显示文本,而不是在样式表中
- 对样式表的任何更改都将覆盖画家
不过,如果你愿意妥协,也有一个解决方案,使用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
更改文本和背景颜色,但您将放弃更改边距、边框大小、边框颜色、边框半径和其他属性。
上下文
我正在使用 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 中的解决方案后,我得出的结论是
- Qt 使用 painter 在进度条中突出显示文本,而不是在样式表中
- 对样式表的任何更改都将覆盖画家
不过,如果你愿意妥协,也有一个解决方案,使用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
更改文本和背景颜色,但您将放弃更改边距、边框大小、边框颜色、边框半径和其他属性。