簡體   English   中英

如何獲取 PyQt QGraphicsTextItem 不透明區域

[英]How to get PyQt QGraphicsTextItem opaque area

self.boundingRect()給我圖像中顯示的虛線尺寸。 我需要獲取不透明區域(繪制實際文本的位置)我嘗試獲取

self.opaqueArea()

但它返回 QPainterPath 對象,它看起來很復雜,顯然沒有寬度或高度函數等作為復雜路徑對象的表示。 問:有沒有更簡單的方法來計算。 任何想法.. 提前致謝獲得藍色區域矩形的簡單方法

print ("TEXT BOUNDING RECT:",self.boundingRect())
print ("TEXT OPAQUE AREA  :",self.document().size())
print ("TEXT OPAQUE AREA BR size  :",self.opaqueArea().boundingRect().size())

輸出:

TEXT BOUNDING RECT: PyQt5.QtCore.QRectF(0.0, 0.0, 590.0, 56.0)
TEXT OPAQUE AREA  : PyQt5.QtCore.QSizeF(590.0, 56.0)
TEXT OPAQUE AREA BR size  : PyQt5.QtCore.QSizeF()

QGraphicsTextItem內部使用QTextDocument來管理文本。 您可以通過.document()訪問它。 文本文檔有一個size 屬性,它返回一個QPointF

 self.document().size()

不幸的是,本文檔的所有方法都返回邊界框的標准矩形。 但是,可以使文本框根據其包含的文本大小重新調整自身。 它並沒有完全降低到像素級別(由於行高填充),但它很接近。

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


class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.view = QGraphicsView()

        scene = QGraphicsScene()

        t = QGraphicsTextItem("Sample\n Text")
        font = t.font()
        font.setPointSize(40)
        font.setWeight(600)
        t.setFont(font)
        t.setTextWidth(400)
        scene.addItem(t)

        rect = t.boundingRect()
        r = QGraphicsRectItem(rect)
        r.setPen(QColor('red'))
        scene.addItem(r)

        d = t.document()
        d.setDocumentMargin(0)
        d.adjustSize()
        rect = t.boundingRect()

        r = QGraphicsRectItem(rect)
        r.setPen(QColor('blue'))
        scene.addItem(r)


        self.view.setScene(scene)

        self.setCentralWidget(self.view)




if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()

以上將給出以下結果 -

顯示原始邊界框和裁剪后的邊界框的圖像。

我唯一的另一個想法是從文本文檔中獲取QPainterPath並計算該QRect ,但它似乎不容易訪問。 一種替代方法是將其繪制QPainter並在那里進行裁剪——但 Qt 中沒有內置的裁剪功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM