Как создать шрифты разных размеров для виджетов, но разрешить их масштабирование с помощью диалогового окна шрифтов в 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. Когда я запускаю это, я вижу, что заголовки таблицы и текст в кнопке меняют размер, когда я изменяю размер шрифта через диалоговое окно. Но метки с фиксированным размером шрифта не меняются. Что если я хотел бы, чтобы они менялись по размеру при изменении размера шрифта? Как "масштабировать" размер шрифта для этих виджетов?

1 ответ

Единственное решение, которое я до сих пор нашел, - это создать коэффициент масштабирования для каждого виджета, а затем, при изменении шрифта, перебирать все виджеты, которые нуждаются в этой обработке, и масштабировать их шрифты индивидуально. Это работает и неплохо для простого графического интерфейса. Однако это может быть громоздким, если есть много виджетов и они разнородны по типу, так как функция 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_())
Другие вопросы по тегам