Как получить непрозрачную область PyQt QGraphicsTextItem - PullRequest
0 голосов
/ 17 февраля 2019

self.boundingRect() дайте размеры пунктирной линии, показанные на рисунке.Мне нужно, чтобы получить непрозрачную область (где рисуется фактический текст) Я пытался получить

self.opaqueArea()

, но он возвращает объект QPainterPath, который кажется довольно сложным и, очевидно, не имеет функций ширины или высоты и т. д. в качестве его представлениясложные пути объектов.В. Есть ли более простой способ рассчитать это?любые идеи .. спасибо заранее easies way to get blue area rect

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 Ответ

0 голосов
/ 17 февраля 2019

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

Выше приведен следующий результат -

Image showing the original bounding box and the cropped one.

Единственная другая идея, которую я имел, состояла в том, чтобы получить QPainterPath из текстового документа и вычислить это QRect, но, похоже, его нелегко получить.Одной из альтернатив будет нарисовать в QPainter и обрезать его там - но в Qt нет встроенной функции обрезки.

...