[英]How to show a preview of the line I'm drawing with QPainter in PyQt5
[英]When I use QFontMetrics in PyQt5, the numbers I get don't match the size of the text that I'm drawing with drawText
我正在嘗試獲取文本的大小,因此我可以相應地縮放它以適合一個盒子。 但不幸的是, QFontMetrics.width() 似乎給出了錯誤的輸出。
這是一個繪制文本的代碼,並使用 QFontMetrics 中的值繪制一個大小應該相似的矩形。 但事實並非如此。 如下圖所示,QFontMetrics 中的值(繪制為矩形)大約是我繪制的值的一半。 不幸的是,我不能只將它乘以 2,因為根據文本,該系數可能是 1.85 或 1.95。
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPainter, QTextDocument, QFont, QFontMetrics
from PyQt5.QtCore import QRect, Qt, QRectF
import sys
font = QFont("times",10)
fm = QFontMetrics(font)
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.InitWindow()
def InitWindow(self):
self.setWindowIcon(QtGui.QIcon("icon.png"))
self.show()
def paintEvent(self, event):
painter = QPainter(self)
painter.setFont(font)
sText = 'Hello World!'
painter.drawText(0,100, sText)
pixelsWide = fm.width(sText)
pixelsHigh = fm.height()
painter.drawRect(0, 100, pixelsWide, pixelsHigh)
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
如QFont 文檔中所述:
請注意,在使用 QFont 之前,必須存在 QGuiApplication 實例。
這顯然包括使用 QFont 作為 QFontMetrics 構造函數。
原因很簡單,也很明顯:QApplication必須知道 UI 環境才能正確計算字體指標,這可能取決於它們將被繪制的繪圖設備。 考慮字體縮放或高 DPI 設置的常見情況:如果沒有 QGuiApplication,Qt 絕對沒有了解這些方面的意義,QFont 顯然不應該(也不能)在其構造函數中處理這些問題,因為 QFontMetrics 不會。
將 QFont 和 QFontMetrics 構造函數移到其他地方,這可能是在 QApplication 創建之后和實際使用之前的任何時刻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.