1

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()
4

1 回答 1

1

QGraphicsTextItem内部使用 aQTextDocument来管理文本。您可以通过.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_()

以上将给出以下结果-</p>

显示原始边界框和裁剪后的图像。

我唯一的另一个想法是从文本文档中获取一个QPainterPath并计算它QRect,但它似乎并不容易访问。一种替代方法是将其绘制为 aQPainter并在那里裁剪——但 Qt 中没有内置裁剪功能。

于 2019-02-17T10:59:54.900 回答