【问题标题】:PyQt: properties via stylesheet only for painting?PyQt:通过样式表的属性仅用于绘画?
【发布时间】: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()

【问题讨论】:

    标签: python qt pyqt5 pyside


    【解决方案1】:

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

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

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

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

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

    来自QWidget.palette() docs:

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

    来自QWidget.font() 文档:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 2017-01-11
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多