插入简短的HTML文本时,QLabel字体不同

时间:2016-09-05 18:28:07

标签: python html qt pyqt pyqt5

我注意到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

如果你运行这段代码,那就是你得到的:

Font size issue in QLabel

为什么两个标签中的字体大小不相等?

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

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

3 个答案:

答案 0 :(得分:2)

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

该示例的真正问题是由于对size属性的误解。这不指定大小。相反,它指定(a)1-7范围内的固定值,或(b)相对于basefont大小的正/负值。所以它能做的就是让字体变得更小&#34;或者&#34;更大&#34;,确切的结果将完全取决于渲染引擎。

要设置完全磅值,请使用css font-size属性:

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

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

答案 1 :(得分:1)

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

它说:

  

此功能已过时。虽然它可能仍然适用于某些浏览器,但不鼓励使用它,因为它可以随时删除。尽量避免使用它。

  

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

答案 2 :(得分:0)

我想我找到了答案。

将html代码段替换为:

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

显然html标记<font size="10">无法正常工作。但是将其作为CSS样式属性(如style="font-size:10pt")插入确实有效。不过,html标签应该可以正常工作。闻起来像Qt bug?

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