【问题标题】:Making Qt Application that work with different System Font Sizes制作适用于不同系统字体大小的 Qt 应用程序
【发布时间】:2013-07-20 21:38:10
【问题描述】:

我正在开发一个面向 Windows 和 Mac OS X 的 Qt 应用程序。我的应用程序中有很多带有文本的对话框。我在 Windows 上创建了该应用程序,我在其中调整了对话框的大小以整齐地适合我的所有文本。当我在 Mac OS X 上编译时,我意识到所有的文本都不合适。此外,在 Windows 控制面板中设置不同的系统字体大小会导致所有对话框大小不正确。

你应该如何在 Qt 中处理不同的系统字体大小?

【问题讨论】:

  • 您在对话框中使用过布局吗?
  • 这是一个复杂的问题。在自定义期间,您不应使用任何“固定”值。例如,所有字体大小都应设置为相对值(而不是像素)。

标签: qt fonts cross-platform font-size


【解决方案1】:

您没有:您让 Qt 为您完成这项工作。使用布局来安排您的小部件;避免设置固定尺寸。最后一点:我推荐使用 Qt-Designer 来创建你的界面。

为 Dmitry 编辑:这里是来自 2 个 ui 文件(使用 pyuic4 生成)的 Python 文件,每个文件都有 2 个 QLabel。 1 Qlabel字体很大(72),另一个是默认的(10)。

  1. Min 和 Max size 有限制:这里如果最大字体大小为 10,则标签正确显示。

    from PyQt4 import QtCore, QtGui
    
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(115, 160)
            sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
            Dialog.setSizePolicy(sizePolicy)
            Dialog.setMinimumSize(QtCore.QSize(115, 160))
            Dialog.setMaximumSize(QtCore.QSize(115, 160))
            self.verticalLayout = QtGui.QVBoxLayout(Dialog)
            self.verticalLayout.setObjectName("verticalLayout")
            self.label = QtGui.QLabel(Dialog)
            font = QtGui.QFont()
            font.setFamily("Andale Mono")
            font.setPointSize(72)
            self.label.setFont(font)
            self.label.setObjectName("label")
            self.verticalLayout.addWidget(self.label)
            self.label_2 = QtGui.QLabel(Dialog)
            self.label_2.setObjectName("label_2")
            self.verticalLayout.addWidget(self.label_2)
    
            self.retranslateUi(Dialog)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def retranslateUi(self, Dialog):
            Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
            self.label.setText(QtGui.QApplication.translate("Dialog", "UGLY", None, QtGui.QApplication.UnicodeUTF8))
            self.label_2.setText(QtGui.QApplication.translate("Dialog", "Not ugly", None, QtGui.QApplication.UnicodeUTF8))
    
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        Dialog = QtGui.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()
        sys.exit(app.exec_())
    
  2. 不再限制大小:可以显示字体大小为72的标签。

    from PyQt4 import QtCore, QtGui
    
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(495, 140)
            self.verticalLayout = QtGui.QVBoxLayout(Dialog)
            self.verticalLayout.setObjectName("verticalLayout")
            self.label = QtGui.QLabel(Dialog)
            font = QtGui.QFont()
            font.setFamily("Andale Mono")
            font.setPointSize(72)
            self.label.setFont(font)
            self.label.setObjectName("label")
            self.verticalLayout.addWidget(self.label)
            self.label_2 = QtGui.QLabel(Dialog)
            self.label_2.setObjectName("label_2")
            self.verticalLayout.addWidget(self.label_2)
    
            self.retranslateUi(Dialog)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def retranslateUi(self, Dialog):
            Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
            self.label.setText(QtGui.QApplication.translate("Dialog", "less UGLY", None, QtGui.QApplication.UnicodeUTF8))
            self.label_2.setText(QtGui.QApplication.translate("Dialog", "Not ugly", None, QtGui.QApplication.UnicodeUTF8))
    
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        Dialog = QtGui.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()
        sys.exit(app.exec_())
    

【讨论】:

  • 布局无法调整外部小部件的大小,仍然必须设置为您知道需要的最大大小
  • @oggmonster 如果您不手动限制小部件的大小(使用 qss 或 setMaximumXXX 方法)并且正确使用布局 - 一切都应该没问题。外部小部件也应放置在布局中。
  • 如果您的外部小部件有最大尺寸,您将无法处理任何字体大小。要么定义最大字体大小,要么释放外部小部件的大小约束。
  • @Frodon,你能提供“丑陋”字体大小的小样本吗?
猜你喜欢
  • 2013-06-23
  • 2017-10-01
  • 2017-07-29
  • 1970-01-01
  • 2021-07-24
  • 2012-04-20
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多