问题描述
我使用PyQt5编写了GUI,最近我想将所有QLabel的字体大小增加到特定大小。我可以遍历整个代码,然后分别更改qfont。但这效率不高,我想我可以重写该类并将所有QLabel字体大小设置为所需的大小。
但是,我需要了解用python编写的类,这样我才能弄清楚如何覆盖它。但是我没有找到任何Python文档来显示QLabel的代码。只有用于c ++的文档。因此,我想知道在哪里可以找到所有PyQt5的python代码?如果没有,如何更改代码中使用的所有QLabel的字体大小?
解决方法
要更改所有QLabel的字体,有几个选项:
-
使用Qt StyleSheet
app.setStyleSheet("QLabel{font-size: 18pt;}")
-
custom_font = QFont() custom_font.setWeight(18); QApplication.setFont(custom_font,"QLabel")
尽管提供的答案应该已经为您提供了足够的建议,但我想补充一些见识。
是否有Qt的python源?
首先,您找不到“用python编写的类”,因为(幸运的是)没有。 PyQt是binding:它是用C ++编写的实际Qt库的接口。
您可能已经知道,虽然Python在当今的计算机上非常快,但它是not that fast,所以使用绑定是一个很好的折衷方案:它允许Python提供简单的语法,并提供C ++提供的所有速度在后台编译库。
您可以找到Qt小部件here(官方镜像)或here的源代码。
如何覆盖默认字体?
嗯,这取决于您如何管理项目。
通常来说,您可以为特定的小部件,其子小部件,顶级窗口甚至整个应用程序设置默认字体[size]。至少有两种方法可以做到这一点。
- 使用
setFont()
:为 target 设置默认字体;您可以使用something.font()
获取当前的默认字体,然后使用font.setPointSize()
(如果字体允许,则使用setPointSizeF()
作为浮点值),然后在目标上调用setFont(font)
。 - 在目标
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对setFont
和setStyleSheet
都使用font propagation(与调色板传播一样多),但是只要设置了样式表,它就会即使已在父窗口小部件的 any 上设置了优先级(直到顶级窗口 OR QApplication实例)。
无论何时应用样式表,基于CSS Selectors都有各种可能性:
-
'font-size: 24px;'
:没有选择器,当前小部件及其任何子级将使用指定的字体大小; -
'QClass { font-size: 24px; }'
:类和子类选择器,任何小部件(包括当前实例)及其相同类/子类的子代将使用指定的字体大小: -
'QClass[property="value"] {...}'
:属性选择器,如上所述,但仅当property
与值匹配时;请注意,值总是用 引用,并且bool值始终为小写; -
'.QClass {...}'
:类选择器,但不是 子类:如果您使用QLabel的子类,并且样式表设置为.QLabel
,则该样式表将不会已应用; -
'QClass#objectName {...}'
:仅适用于objectName()
匹配的小部件; -
'QParentClass QClass {...}
':申请属于QParentClass
子级的QClass类的小部件 -
'QParentClass > QClass {...}
':申请QClass类的小部件,这些类是QParentClass
的直接子级
请注意,setFont
和setStyleSheet
都支持传播,但是setStyle
仅在设置为QApplication实例时才可用于子级:如果使用widget.setStyle()
,则不会会影响小部件的任何子级。
最后,请记住:
- 每当重设一个小部件时,它都会以“层叠”模式(最接近的父级具有优先级)接收其父级的字体,调色板和样式表; 只要设置了任何相关属性,并且调色板/字体属性与样式表不兼容,或者
- 样式表在调色板和字体上都具有优先权(或者至少它们以意外的方式运行) ;
Qt样式表
这可能是您所处情况中最简单的方法,您实际上是在尝试对所有QLabel应用特定的“样式”。您可以将样式应用于整个应用程序或特定窗口,这将影响与选择器匹配的所有子代。
因此,在您的情况下,要应用于应用程序中的所有小部件,您可以执行以下操作来设置所有QLabel
实例的字体大小:
app = QApplication([])
app.setStyleSheet('.QLabel { font-size: 14pt;}')
注意:请确保先设置样式表 ,然后再将小部件附加到其父项,否则您将需要手动触发样式刷新。
还...
-
.QLabel
选择器仅适用于QLabel
类实例,而不适用于继承QLabel
的类。要同时应用于QLabel和继承的类,请在样式表中使用QLabel {...}
代替.QLabel {...}
。
一些文档可以帮助您:
- Qt样式表文档:https://doc.qt.io/qt-5/stylesheet.html
- Qt样式表语法:https://doc.qt.io/qt-5/stylesheet-syntax.html
- Qt样式表参考:https://doc.qt.io/qt-5/stylesheet-reference.html
- PyQt文档:https://doc.qt.io/qtforpython/api.html
完成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
上设置字体大小以及使用样式表。