【问题标题】:Qt use palette color in stylesheetQt 在样式表中使用调色板颜色
【发布时间】:2018-08-17 09:31:36
【问题描述】:

在 qt 中,您通常使用 QPalette 设置 QWidget 的颜色。

例子:

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);

现在我有一个小问题。无法使用QPalette 更改 QLineEdit 的边框颜色。这意味着,我必须使用QStyleSheet

例子:

QLineEdit *line = new QLineEdit();
line.setStyleSheet("border: 1px solid green");

但是现在我不能用QPalette 设置QLineEdit 的basecolor,因为QLineEdit 的背景颜色不再连接到QPalette::base。 这意味着,以下代码不会更改QLineEditbackground-color

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);
line->setStyleSheet("border: 1px solid green");

但不可能在 StyleSheet 中定义 QLineEdit 的 background-color,因为 QLineEditbackground-color 必须是动态的。

我的问题:如何将QLineEdit 的背景色与QPalette::base 连接起来,以使用QPalette 动态定义QLineEditbackground-color

【问题讨论】:

  • 为什么不能简单地创建/格式化包含所需背景和边框值的QString
  • 我不知道,你的意思。你的意思是,我应该创建一个继承自 QString 的类,其中包含一个背景字段和一个边框字段? - QString 中没有背景和边框属性,是吗?

标签: qt qtstylesheets qpalette


【解决方案1】:

或者:

line->setStyleSheet(QStringLiteral(
    "border: 1px solid green;"
    "background-color: palette(base);"
));

参考:http://doc.qt.io/qt-5/stylesheet-reference.html#paletterole

使用 PaletteRole 还可以让 CSS 位于单独的文件/源中。

【讨论】:

  • 这应该是正确的答案。当前接受的答案更像是“使用从调色板对象复制的颜色生成样式表”。这(根据我)与问题的陈述方式(以及我想要做的事情)相去甚远。这就是说,我似乎无法让它工作(我所有的颜色都是黑色的)。有人知道某处的工作示例吗?我找不到任何... :(
  • 轻微修正,颜色不是黑色,但我设置的调色板颜色似乎被忽略了,我得到了一些默认调色板......
  • @pythonator 在小部件上使用 CSS 时,小部件的默认或分配的调色板可能会被忽略(尤其是在案例或背景/边框/框架中)。在这种情况下,PaletteRole 似乎最好在引用默认应用程序QPalette 时使用(可选地使用 QApplication::setPalette()` 设置)。确切的行为,尤其是调色板颜色如何传播(或不传播)可能取决于所使用的 Qt 样式(例如“融合”或“窗口”等)。 “Fusion”在 QPalette 继承方面是最灵活和可预测的,也可以与 CSS 混合使用。
【解决方案2】:

只需在运行时构造所需的QString...

auto style_sheet = QString("border: 1px solid green;"
                           "background-color: #%1;")
  .arg(QPalette().color(QPalette::Base).rgba(), 0, 16);

上面的结果应该是QString,比如...

border: 1px solid green;
background-color: #ffffffff;

那么……

line->setStyleSheet(style_sheet);

【讨论】:

  • 啊当然现在我明白你的意思了。这是一个简单而伟大的想法。 - 谢谢!
【解决方案3】:

我找到了适合我的情况的解决方案。因为我只想遮住边框,不想给它上色,所以可以使用QLineEdit::setFrame(bool)的方法。但是,如果我想像上面的例子那样给框架上色呢?到目前为止,我还没有找到解决方案。我对每一个答案都很满意。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多