Как получить непрозрачную область PyQt QGraphicsTextItem
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()
1 ответ
QGraphicsTextItem
внутренне использует QTextDocument
управлять текстом. Вы можете получить доступ к этому через .document()
, Текстовый документ имеет свойство размера, которое возвращает 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 нет встроенной функции обрезки.