2014-10-30 31 views
2

我想設置字體QTextEditQTreeWidget相同。爲QTextEdit設置字體被忽略,沒有明顯的原因

當我從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_()) 

回答

2

您不能安全地假設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) 
+0

良好的洞察力。謝謝。 – Fenikso 2014-10-31 09:00:30