如何解决Qt 样式表:控制进度条文本高亮颜色? 上下文问题解决方案
上下文
我正在使用 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 */
}
问题
不幸的是,我发现自己无法更改突出显示的进度文本颜色,一旦它被进度条本身遮住或覆盖。
这可以在上面看到。
解决方案
我已尝试查看是否可以为文本设置 highlight 属性。我知道从调色板中,我可以设置对比突出显示颜色,一旦进度条覆盖它,进度文本标签就会切换颜色。但是,我在这里找不到如何访问该属性
QProgressBar::text::highlighted {
color: #204a87; /* Doesn't do anything */
}
我还尝试向 QProgressBar::chunk
添加颜色属性,如上所示。这也没有做任何事情。
如何为样式表中的进度条标签设置对比突出显示颜色?我一直主要在寻找 this Qt resource 以获得指导,但它并未涵盖这种情况。
解决方法
这是我自己的结论,可能会有更好的答案。
根据progress bar's customization documentation的说法,样式表好像只能自定义border、chunk、text-align。即使添加 selection-color
也不起作用,因为实际上并未选择文本。
在 this question 中尝试解决方案后,我得出结论
- Qt 使用画笔在进度条中突出显示文本,而不是在样式表中
- 对样式表的任何更改都将覆盖画家
但是,如果你愿意妥协,有一个解决方案,使用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
更改文本和背景颜色,但您放弃更改边距、边框大小、边框颜色、边框半径和其他属性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。