更改所有 QLabel 对象 PyQt5 的字体大小

Changing font size of all QLabel objects PyQt5

我使用 PyQt5 编写了一个 gui,最近我想将我所有 QLabel 的字体大小增加到特定大小。我可以单独检查整个代码并更改 qfont。但这效率不高,我想我可以覆盖 class 并将所有 QLabel 字体大小设置为所需的大小。

但是,我需要理解 python 中写的 class,这样我才能弄清楚如何覆盖它。但是我没有找到任何 python 文档来说明 QLabel 的代码是什么样子的。只有 c++ 的文档。因此,我想知道我可以从哪里获得所有 PyQt5 的 python 代码(如果存在)?如果没有,我该如何更改代码中使用的所有 QLabel 的字体大小?

Qt 样式表

在您的情况下,这可能是最简单的方法,您实际上是在尝试将特定的“样式”应用于所有 QLabel。您可以将样式应用于整个应用程序或特定的 window,这将影响与选择器匹配的所有子项。

因此,在您的情况下,要应用于应用程序中的所有小部件,您可以执行以下操作来设置所有 QLabel 实例的字体大小:

  app = QApplication([])
  app.setStyleSheet('.QLabel { font-size: 14pt;}')

注意:请务必在将样式表设置为将您的小部件附加到其父级之前,否则您将需要手动触发样式刷新。

还有...

  • .QLabel 选择器仅适用于 QLabel class 个实例,不适用于继承 QLabel 的 class 实例。要应用于 QLabel 和继承的 classes,请在样式表中使用 QLabel {...} 而不是 .QLabel {...}

一些帮助您的文档:

完成 Adrien 的回答,您可以使用 QFont class 并对每个按钮执行 .setFont() 方法。

my_font = QFont("Times New Roman", 12)
my_button.setFont(my_font)

使用这个class你也可以改变一些字体参数,见https://doc.qt.io/qt-5/qfont.html

是的,C++ 的文档可以阅读,因为 C++ 中的所有方法和 classes 都在 Python.

中实现

UPD:QWidget class 也有 setFont 方法,因此您可以在 centralwidget 上设置字体大小以及使用样式表。

要更改所有 QLabel 的字体,有几种选择:

  • 使用 Qt 样式表

    app.setStyleSheet("QLabel{font-size: 18pt;}")
    
  • 使用QApplication::setFont()

    custom_font = QFont()
    custom_font.setWeight(18);
    QApplication.setFont(custom_font, "QLabel")
    

虽然提供的答案应该已经给了你足够的建议,但我想补充一些见解。

Qt 有 python 来源吗?

首先,你找不到“写在python中的class”,因为(幸好)有none。 PyQt 是一个 binding: 它是实际 Qt 库的接口,它是用 C++ 编写的。

您可能已经知道,虽然 Python 在如今的计算机上相当快,但它是 not that fast,因此使用绑定是一个很好的折衷方案:它允许简单的语法 Python 提供并给出 C++ 编译库在后台提供的所有速度。

您可以找到 Qt 小部件的源代码 here (official mirror), or here

如何覆盖默认字体?

好吧,这取决于您将如何管理项目。

一般来说,您可以为特定小部件设置默认字体 [大小],为其 child 小部件,为顶级 window甚至整个应用程序。至少有两种方法可以做到。

  1. 使用setFont():它为目标设置默认字体;您可以使用 something.font() 获取当前默认字体,然后使用 font.setPointSize() (or setPointSizeF() 作为浮点值(如果字体允许),然后在目标上调用 setFont(font)
  2. 在目标中使用 font[-*] setStyleSheet();

目标?

目标可能是小部件本身、它的 parent 之一甚至 QApplication.instance()。您可以在其中任何一个上同时使用 setFont()setStyleSheet()

    font = self.font()
    font.setPointSize(24)
    # set the font for the widget:
    self.pushButton.setFont(someFont)
    # set the font for the top level window (and any of its children):
    self.window().setFont(someFont)
    # set the font for *any* widget created in this QApplication:
    QApplication.instance().setFont(someFont)

    # the same as...
    self.pushButton.setStyleSheet(''' font-size: 24px; ''')
    # etc...

此外,考虑为应用程序实例设置 Qt.AA_UseStyleSheetPropagationInWidgetStyles 属性。

设定与传承

默认情况下,Qt 对 setFontsetStyleSheet 使用 font propagation(与调色板传播一样多), 每当样式sheet 已设置,它优先,即使它设置在 parent 小部件的 any 上(最高级别 window QApplication实例)。

无论何时应用样式sheet,都有多种可能性,基于CSS Selectors:

  • 'font-size: 24px;': 没有选择器,当前widget及其任何child将使用指定的字体大小;
  • 'QClass { font-size: 24px; }': classes 和 subclasses 选择器,任何部件(包括当前实例)及其 children 相同的 class/subclass 将使用指定的字体大小:
  • 'QClass[property="value"] {...}': 属性 选择器,同上,但前提是 property 匹配该值;请注意,值总是 被引用,而 bool 值总是小写;
  • '.QClass {...}': classes 选择器,但 not subclasses: 如果你使用的是 subclass的QLabel和样式sheet设置为.QLabel,样式sheet不会被应用;
  • 'QClass#objectName {...}':仅申请objectName()匹配的小部件;
  • 'QParentClass QClass {...}':申请classQClass的widget是QParentClass
  • 的children
  • 'QParentClass > QClass {...}':申请classQClass的widgetdirectchildren of QParentClass

请注意,setFontsetStyleSheet 都支持传播,但 setStyle 仅在设置为 QApplication 实例时适用于 children:如果您使用 widget.setStyle() 它不会影响任何小部件的 children.

最后,记住:

  • 每当一个小部件被重新parent编辑时,它都会接收其 parent 的字体、调色板和样式sheet,处于“级联”模式(最接近的 parent 优先);
  • stylesheets 在调色板和字体上都有优先权,只要设置了任何相关属性,并且 palette/font 属性 not 兼容stylesheets(或者,至少,它们以意想不到的方式表现);