仅为一种小部件设置样式

Posted

技术标签:

【中文标题】仅为一种小部件设置样式【英文标题】:Setting style for only one kind of widget 【发布时间】:2013-04-17 19:16:01 【问题描述】:

如何全局更改一种特定类型小部件的样式?由于那个漂亮的边框,我想让所有 QGroupBox 实例都使用“plastique”样式:

左边是 GTK 风格(我不喜欢);右边是我想要的样式。

(来源:qt-project.org)

(来源:qt-project.org)

我不想为程序中的每个 QGroupBox 实例设置样式,我想像在 QApplication::setStyle() 中一样全局设置它,但仅适用于 QGroupBox。有什么办法吗?

谢谢。

【问题讨论】:

【参考方案1】:

您必须在要重新设置样式的小部件上使用QWidget::setStyle 函数。

如果您希望所有组框都具有相同的样式,您可以创建一个子类并仅使用它(没有最简单的方法来重新设置相同小部件类型的所有实例的样式):

class MyGroupBox: public QGroupBox

    public:
        MyGroupBox(QWidget* parent) : QGroupBox(parent)
        
            setStyle(/* the style you want */);
        
;

另一个不太方便的选择是遍历widget树,根据widget的类名设置样式。

您也可以使用Qt Style Sheets。请注意,目前自定义样式不支持这些。

【讨论】:

谢谢。我担心这是唯一的解决方案。很遗憾,每个 QWidget 子类都没有静态 setStyle (我猜从实现的角度来看这是非常不现实的)。 看来您的想法就像在 CSS 中一样(您可以在其中设置“类”的样式),不是吗?正如你所说,这里的实现是非常不现实的。 如果我理解,可以将样式表 css 应用于“类”。例如:“QLineEdit background: yellow ”指定所有 QLineEdits 都应使用黄色作为其背景颜色,如文档中所述。我只是不能说“QLineEdit style: 'plastique' ”之类的话。那将是完美的。 不,这是不可能的,因为样式表是由样式解析和解释的;例如,如果您设置样式表QLineEdit background: yellow ,则底层样式(可能是QWindowsStyleQPlastiqueStyle)将改变它绘制线条编辑的方式;这就是为什么您可以在 qss 中选择样式的原因。您可以使用 qss 制作一个完整的“样式”,即选择一种随处可用的样式(例如 QPlastiqueStyle)并制作一个可以更改每个可能小部件外观的 qss。【参考方案2】:

您可以为此使用qss 文件;它们是 Qt 元素的样式表。如解释here

qss 中,您可以为QGroupBox 类指定样式,类似于在css 中为html 网站指定的样式。

【讨论】:

我知道如何自定义小部件类型的单个元素(这几乎是我想要的),但我看不到如何更改样式。我的意思是,很难调整所有这些小部件元素以以某种风格模仿它们的外观。 什么意思?如果您只是为该类指定样式,则该类的所有单个元素都将获得该样式。 我可以为一个类指定一个样式表,好的。但是我怎么能在 css 中说“拜托,请使用样式 plastique”?

以上是关于仅为一种小部件设置样式的主要内容,如果未能解决你的问题,请参考以下文章

为每一天设置不同的颜色(小部件)

在 Qt 中为整个小部件设置样式表

仅为 QTabWidget 中的选项卡显示工具提示,而不是整个小部件

如何在 PySide 中使用样式表为整个小部件设置背景颜色

Qt 中的样式表、隐藏的小部件和大小

样式化的*** QPushButton 小部件无法正确呈现