【问题标题】:Changing font size of all QLabel objects PyQt5更改所有 QLabel 对象 PyQt5 的字体大小
【发布时间】:2020-12-06 02:12:04
【问题描述】:

我使用 PyQt5 编写了一个 gui,最近我想将所有 QLabels 的字体大小增加到特定大小。我可以逐个浏览整个代码并更改 qfont。但这效率不高,我想我可以重写该类并将所有 QLabel 字体大小设置为所需的大小。

但是,我需要了解用 python 编写的类,以便弄清楚如何覆盖它。但我没有找到任何显示 QLabel 的代码外观的 python 文档。只有 c++ 的文档。因此,我想知道在哪里可以获得所有 PyQt5 的 Python 代码(如果存在)?如果没有,如何更改代码中使用的所有 QLabels 的字体大小?

【问题讨论】:

    标签: python pyqt pyqt5 qlabel


    【解决方案1】:

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

    有Qt的python源码吗?

    首先,您找不到“用 python 编写的类”,因为(幸运的是)没有。 PyQt 是一个binding:它是实际 Qt 库的接口,它是用 C++ 编写的。

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

    你可以找到Qt小部件的源代码here(官方镜像),或者here

    如何覆盖默认字体?

    嗯,这取决于您将如何管理您的项目。

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

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

    目标?

    目标可能是小部件本身、它的父级之一,甚至是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(与调色板传播一样多),但是无论何时设置样式表,它都会优先,即使它是设置在 任何 的父窗口小部件上(直到顶级窗口 OR QApplication 实例)。

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

    • 'font-size: 24px;': 没有选择器,当前小部件和它的任何子部件都将使用指定的字体大小;
    • 'QClass { font-size: 24px; }':类和子类选择器,任何widget(包括当前实例)及其同一个类/子类的子类都将使用指定的字体大小:
    • 'QClass[property="value"] {...}':属性选择器,同上,但前提是property匹配值;请注意,值总是引用,bool 值总是小写;
    • '.QClass {...}':类选择器,但不是子类:如果您使用 QLabel 的子类并且样式表设置为 .QLabel,则不会应用该样式表;
    • 'QClass#objectName {...}':仅适用于 objectName() 匹配的小部件;
    • 'QParentClass QClass {...}':申请属于QParentClass的子类QClass的小部件
    • 'QParentClass > QClass {...}':申请 QClass 类的小部件,它们是QParentClass直接 子级

    注意setFontsetStyleSheet 都支持传播,但setStyle 仅在设置为 QApplication 实例时对子级有效:如果您使用widget.setStyle(),它不会对任何小部件的子级产生影响。

    最后,记住:

    • 每当一个小部件重新设置父级时,它都会以“级联”模式接收其父级的字体、调色板和样式表(最近的父级优先);
    • 样式表在调色板和字体上都具有优先权,只要设置了任何相关属性,并且调色板/字体属性与样式表兼容(或者,至少,它们的行为方式出乎意料) ;

    【讨论】:

      【解决方案2】:

      Qt 样式表

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

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

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

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

      还有……

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

      一些文档可以帮助您:

      【讨论】:

      • 注意:使用 . 选择器意味着 QLabel 子类将使用该样式表。
      • 对不起,但仍然不完全正确。 QMainWindow 是一个QWidget 子类,这意味着它确实 支持样式表 它们的级联行为。虽然它通常没有直接绘制(因为它通常绘制几乎任何东西),但它确实提交给它设置的样式表(直接而不是)。首先,您可以为任何子小部件设置样式表。然后它还支持基本的样式表属性,例如font[-*]colorbackground[-color]border[-*]:即使不覆盖paintEvent,您也可以清楚地看到边框和背景实际上是应用的。
      • 另外,关于在创建小部件之前设置样式表的注释不是真的。只要将小部件添加到具有某些样式表集的父级(包括 QApplication),它们就会被应用。
      • @musicamante 修复了 QMainWindow,所以习惯了 QtQuick 现在我只是混合了两者。关于之前设置样式表,我明白你的意思,说“附加”而不是“创建”会更正确,因为附加会触发重新设置样式。
      【解决方案3】:

      要更改所有 QLabels 的字体,有几个选项:

      • 使用 Qt 样式表

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

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

      【讨论】:

      • 哦,我从来没有注意到setFont 现在有一个类说明符。他们什么时候添加的?感谢您的补充。
      • @AdrienLeravat 好吧,它至少存在 15-18 年,当时只有 Qt3...
      • @musicamante 很高兴知道,出于某种原因,我从未关注它,或者只是忘记了
      【解决方案4】:

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

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

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

      是的,C++ 的文档是可以阅读的,因为 C++ 中的所有方法和类都是在 Python 中实现的。

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

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 2020-09-21
        • 2023-03-09
        • 2012-05-14
        • 1970-01-01
        • 2016-10-15
        • 2017-04-13
        • 2012-08-21
        • 1970-01-01
        相关资源
        最近更新 更多