如何获取PyQt QGraphicsTextItem不透明区域
How to get PyQt QGraphicsTextItem opaque area
self.boundingRect()
给我图中显示的虚线尺寸。我需要获得不透明区域(绘制实际文本的地方)
我试过
self.opaqueArea()
但它 returns 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 property,其中 return 是一个 QPointF
。
self.document().size()
不幸的是,此文档的所有方法return 边界框的标准矩形。但是,可以使文本框重新调整自身以适应它包含的文本的大小。它并没有完全下降到像素级别(由于行高填充),但它很接近。
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 中没有内置裁剪功能。
self.boundingRect()
给我图中显示的虚线尺寸。我需要获得不透明区域(绘制实际文本的地方)
我试过
self.opaqueArea()
但它 returns 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 property,其中 return 是一个 QPointF
。
self.document().size()
不幸的是,此文档的所有方法return 边界框的标准矩形。但是,可以使文本框重新调整自身以适应它包含的文本的大小。它并没有完全下降到像素级别(由于行高填充),但它很接近。
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 中没有内置裁剪功能。