PyQt:通过样式表的属性仅用于绘画?
Posted
技术标签:
【中文标题】PyQt:通过样式表的属性仅用于绘画?【英文标题】:PyQt: properties via stylesheet only for painting? 【发布时间】:2020-04-12 18:12:25 【问题描述】:我想在 PyQt5 中使用 style sheet
来布局自定义小部件。通常这是可行的:小部件与修改后的属性一起显示。然而,小部件的属性(例如 style-sheet font-family
与 QLabel.label()
)似乎保持默认值(s. 下面的最小示例)。
样式表是否只用于绘制小部件而不改变小部件本身?
有没有办法获得“新”属性?否则,例如 FontMetrics
与 style 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:通过样式表的属性仅用于绘画?的主要内容,如果未能解决你的问题,请参考以下文章