设置QTextEdit的字体无明显原因被忽略

2 投票
1 回答
1461 浏览
提问于 2025-04-30 15:39

我想把QTextEdit的字体设置成和QTreeWidget一样。

当我从QTextEdit获取字体,然后尝试把这个字体设置到QTreeWidget时,结果却不如我所愿。不过,如果我创建一个新的字体QFont("Segoe UI", 9),这个字体恰好和我电脑上(Windows 7)QTreeWidget的字体一样,然后把它设置到QTextEdit上,就能成功了。

下面的代码在比较字体时打印出True,但结果却没有达到预期。如果把self.text.setFont(new_font)这一行注释去掉,问题就解决了。为什么会这样呢?

import string
import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont


TEXT = string.printable[:-5]

def print_font(font):
    print("Family: {}, Size: {}".format(font.family(), font.pointSize()))


class Window(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)

        self.list = QTreeWidget(self) 
        self.list.addTopLevelItem(QTreeWidgetItem((TEXT,)))
        self.list.setRootIsDecorated(False)
        self.list.setHeaderHidden(True)
        self.list.setMinimumHeight(25)

        self.text = QTextEdit(self)
        self.text.setText(TEXT)
        self.text.setMinimumHeight(25)

        self.layout = QGridLayout()
        self.layout.setContentsMargins(5, 5, 5, 5)
        self.layout.addWidget(self.list)
        self.layout.addWidget(self.text)

        self.resize(620, 20)
        self.setLayout(self.layout)
        self.show()

        list_font = self.list.font()
        new_font = QFont("Segoe UI", 9)
        print(list_font == new_font)
        self.text.setFont(list_font)
#         self.text.setFont(new_font)

        print_font(self.list.font())
        print_font(self.text.font())


app = QApplication(sys.argv)
win = Window()
sys.exit(app.exec_())
暂无标签

1 个回答

3

你不能完全相信QFont报告的属性和实际使用的属性是一样的。它们可能是一样的,但也不一定。

要安全地获取实际使用的值,你需要使用QFontInfo。在Linux上,我从QFont和QFontInfo得到的值是不一样的,但字体传输是成功的;而在Windows上,它们是一样的,但传输却失败了。真奇怪。

总之,似乎在Windows上复制字体有些问题,但我无法准确诊断出是什么原因。可能和字体缓存有关?

我原以为:

    list_font = QFont(self.list.font())

可能会有所不同——但实际上并没有。最后,在Windows上唯一对我有效的方法是:

    list_font = QFont()
    list_font.fromString(self.list.font().toString())
    self.text.setFont(list_font)

撰写回答