【问题标题】:QLabel font differs when inserting a short HTML text插入短 HTML 文本时 QLabel 字体不同
【发布时间】:2017-01-13 03:22:58
【问题描述】:

我注意到 PyQt GUI 中 QLabel() 的字体大小不是很一致。让我们看一下下面的例子。我已经编写了一个完整的 python 文件来进行快速测试。它将弹出一个带有两个标签的 Qt 窗口:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import os

'''---------------------------------------------------------------------'''
'''                                                                     '''
'''                        T E S T I N G                                '''
'''                                                                     '''
'''---------------------------------------------------------------------'''


class TestWindow(QMainWindow):
    def __init__(self):
        super(TestWindow, self).__init__()

        # 1. Set basic geometry and color.
        # --------------------------------
        self.setGeometry(100, 100, 800, 600)
        self.setWindowTitle('Hello World')
        palette = QPalette()
        palette.setColor(QPalette.Window, QColor(200,200,200))
        self.setPalette(palette)
        self.show()

        # 2. Create the central frame.
        # ----------------------------
        self.centralFrame = QFrame(self)
        self.centralFrame.setFrameShape(QFrame.NoFrame)
        self.centralLayout = QVBoxLayout()
        self.centralFrame.setLayout(self.centralLayout)
        self.centralLayout.setSpacing(5)
        self.centralLayout.setContentsMargins(20,20,20,20)
        self.setCentralWidget(self.centralFrame)

        # 3. Do the test.
        # ----------------
        # TEST CASE 1
        # The label with html
        self.infoLbl = QLabel()
        self.infoLbl.setTextFormat(Qt.RichText)
        self.infoLbl.setFrameShape(QFrame.StyledPanel)
        self.infoTxt = \
'<html> \
<head> \
</head> \
<body> \
<font size="10"> \
<p style="margin-left:8px;">My html text, font = 10pt</p> \
</font> \
</body> \
</html> '
        self.infoLbl.setText(self.infoTxt)
        self.infoLbl.setMaximumHeight(50)
        self.infoLbl.setMaximumWidth(500)

        # TEST CASE 2
        # The label with a normal string
        self.normalLbl = QLabel()
        self.normalLbl.setFrameShape(QFrame.StyledPanel)
        self.normalLbl.setText('My normal text, font = 10pt')
        font = QFont()
        font.setFamily("Arial")
        font.setPointSize(10)
        self.normalLbl.setFont(font)
        self.normalLbl.setMaximumHeight(50)
        self.normalLbl.setMaximumWidth(500)

        # 4. Add both labels to the central layout.
        # ------------------------------------------
        self.centralLayout.addWidget(self.infoLbl)    # <- The label with html snippet
        self.centralLayout.addWidget(self.normalLbl)  # <- The normal label
        self.centralLayout.addWidget(QLabel())        # <- Just a spacer


if __name__== '__main__':
    app = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Fusion'))
    testWindow = TestWindow()
    app.exec_()
    app = None

如果你运行这段代码,你会得到:

为什么两个标签的字体大小不一样?

为了完整起见,这是我的系统:

  • 操作系统:Windows 10,64 位
  • Python 版本:v3(anaconda 包)
  • Qt 版本:PyQt5

【问题讨论】:

    标签: python html fonts pyqt5 qlabel


    【解决方案1】:

    我想我找到了答案。

    将 html sn-p 替换为:

        self.infoTxt = \
        '<html> \
        <head> \
        </head> \
        <body> \
        <p style="margin-left:8px; font-size:10pt">My html text, font = 10pt</p> \
        </body> \
        </html> '
    

    显然 html 标签&lt;font size="10"&gt; 不能正常工作。但是将其作为 CSS 样式的属性插入,如 style="font-size:10pt" 确实有效。不过,html 标签应该可以正常工作。这闻起来像 Qt 错误?

    编辑: 显然,这不是 Qt 错误。请参阅@ekhumoro 的答案以获得澄清。

    【讨论】:

      【解决方案2】:

      font 标签在 Qt4 和 Qt5 中仍然得到完全支持。它已被当前的 HTML 标准淘汰的事实是无关紧要的,因为 Qt 只支持 a limited subset of HTML4

      该示例的真正问题是由于对size 属性的误解。这没有指定 point 大小。相反,它指定(a)1-7 范围内的固定值,或(b)相对于basefont 大小的加/减值。所以它所能做的就是让字体“变小”或“变大”,而确切的结果将完全取决于渲染引擎。

      要设置精确点大小,请使用 css font-size 属性:

      <p style="font-size:10pt">My html text, font = 10pt</p>
      

      注意:请参阅CSS Properties Table 以获取 Qt 的富文本引擎支持的所有 css 属性的列表。

      【讨论】:

      • 我已经对其他答案进行了适当的编辑,以便澄清对 size 属性的误解。非常感谢您帮助我了解问题的根源。
      【解决方案3】:

      正如您已经发现的那样,您似乎需要使用样式。更多信息在这里:

      上面写着:

      此功能已过时。尽管它可能在某些浏览器中仍然有效,但不鼓励使用它,因为它可能随时被删除。尽量避免使用它。

      HTML5 不支持该标签。改用 CSS。

      【讨论】:

      • 所以其实这不是Qt中的一个bug,只是&lt;font&gt;标签的遗漏,因为它已经过时了。太感谢了。这清除了一切!
      • @K.Mulier。不,这是错误的。 Qt 仍然支持font 标签,只是你错误地使用了size 属性。请参阅我的答案以获得完整的解释。
      • 谢谢@ekhumoro 的解释:-)
      猜你喜欢
      • 1970-01-01
      • 2021-01-16
      • 2012-07-31
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多