PyQt:通过样式表的属性仅用于绘画?

Posted

技术标签:

【中文标题】PyQt:通过样式表的属性仅用于绘画?【英文标题】:PyQt: properties via stylesheet only for painting? 【发布时间】:2020-04-12 18:12:25 【问题描述】:

我想在 PyQt5 中使用 style sheet 来布局自定义小部件。通常这是可行的:小部件与修改后的属性一起显示。然而,小部件的属性(例如 style-sheet font-familyQLabel.label())似乎保持默认值(s. 下面的最小示例)。

样式表是否只用于绘制小部件而不改变小部件本身? 有没有办法获得“新”属性?否则,例如 FontMetricsstyle sheet 结合使用是不可能的?

import sys

from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtGui import QFontInfo

stylesheet = '''
QLabel
    font-family: Wingdings;

'''

app = QApplication(sys.argv)
label = QLabel('Hello World!')
label.setStyleSheet(stylesheet)
print(QFontInfo(label.font()).family())  # prints out: MS Shell Dlg 2; expected: Wingdings
label.show()
app.exec()

【问题讨论】:

【参考方案1】:

您的怀疑确实是正确的:使用样式表时,许多小部件属性都被忽略了, 对于它们的 getter 和 setter。

没有直接的方法知道这些值,因为它们都是由 Qt 的解析器在内部管理的。

最重要的是,palette()font()(显然是 fontMetrics())不受影响,因此您无法知道样式表使用的字体属性或调色板颜色是什么,如果您尝试设置字体或设置一个新的调色板你不会得到任何结果(这一切都假设你实际上在样式表中设置了一些颜色或字体,显然)。

这也适用于其他小部件特定属性(例如,QFrame 边框样式),甚至可能在不同样式/系统上产生略微不同的结果。

这也是您应该使用样式表或 QPalette 的原因,因为混合使用它们可能会导致意外行为。

来自QWidget.palette() docs:

警告:不要将此功能与 Qt 样式表结合使用。

来自QWidget.font() 文档:

注意:如果 Qt 样式表与 setFont() 用于同一小部件​​上,则样式 如果设置冲突,工作表将优先。

【讨论】:

以上是关于PyQt:通过样式表的属性仅用于绘画?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 基本语法:样式控制

PyQt5 样式表用于 QWidget 的孩子更改 QWidget

使用 Qt 样式表的类实例的样式

样式表的基本概念和属性

Css基础

样式表的属性