首页 > 解决方案 > 如何为小部件创建不同的字体大小但允许它们在 PySide2 中使用字体对话框进行缩放?

问题描述

假设我有 3 个标签,每个标签都应该有不同大小的文本。检查此示例代码:

import sys
from PySide2 import QtCore, QtGui, QtWidgets

def Fonty():
    ok, font = QtWidgets.QFontDialog.getFont(tableWidget)
    if ok:
        app.setFont(font)
        tableWidget.resizeColumnsToContents()
        tableWidget.resizeRowsToContents()

app = QtWidgets.QApplication(sys.argv)
tableWidget = QtWidgets.QTableWidget()
tableWidget.setColumnCount(4)
tableWidget.setRowCount(1)

for x in range(3):
    label = QtWidgets.QLabel(tableWidget)
    font = QtGui.QFont()
    size = 8 + (x * 2)
    font.setPointSize(size)
    label.setFont(font)
    label.setText("Testing")
    tableWidget.setCellWidget(0, x, label)
    tableWidget.resizeColumnsToContents()

pushButton = QtWidgets.QPushButton()
pushButton.setText("Fonts")
pushButton.clicked.connect(Fonty)
tableWidget.setCellWidget(0, 3, pushButton)
tableWidget.resizeColumnsToContents()

tableWidget.show()
sys.exit(app.exec_())

标有“字体”的按钮将打开一个标准的 Qt 字体对话框。当我运行它时,我可以看到当我通过对话框更改字体大小时,表格的标题和按钮中的文本会改变大小。但是具有固定字体大小的标签不会改变。如果我希望它们随着字体大小的变化而改变大小怎么办?如何“缩放”这些小部件的字体大小?

标签: pythonpyside2qfont

解决方案


到目前为止,我想出的唯一解决方案是为每个小部件创建一个比例因子,然后在更改字体时,遍历所有需要这种处理的小部件并单独缩放它们的字体。这对一个简单的 GUI 来说是可行的,而且还不错。如果有很多小部件并且类型不同,这可能会很麻烦,因为 findChildren 函数可能会有点麻烦。我很想知道是否有更好的方法来做到这一点。也许有一个我还没有找到的 Qt 方法?

import sys
from PySide2 import QtCore, QtGui, QtWidgets

def Fonty():
    ok, font = QtWidgets.QFontDialog.getFont(tableWidget)
    if ok:
        app.setFont(font)
        size = font.pointSize()
        children = tableWidget.findChildren(QtWidgets.QLabel)
        for child in children:
            font.setPointSize(size * child.scaleF)
            child.setFont(font)
        tableWidget.resizeColumnsToContents()
        tableWidget.resizeRowsToContents()

app = QtWidgets.QApplication(sys.argv)
fontsize = app.font().pointSize()
tableWidget = QtWidgets.QTableWidget()
tableWidget.setColumnCount(4)
tableWidget.setRowCount(1)

for x in range(3):
    label = QtWidgets.QLabel(tableWidget)
    font = QtGui.QFont()
    size = 8 + (x * 2)
    label.scaleF = size/fontsize
    font.setPointSize(size)
    label.setFont(font)
    label.setText("Testing")
    tableWidget.setCellWidget(0, x, label)
    tableWidget.resizeColumnsToContents()

pushButton = QtWidgets.QPushButton()
pushButton.setText("Fonts")
pushButton.clicked.connect(Fonty)
tableWidget.setCellWidget(0, 3, pushButton)
tableWidget.resizeColumnsToContents()

tableWidget.show()
sys.exit(app.exec_())

推荐阅读