Python 如何获取PyQt QGraphicsTextItem不透明区域
Python 如何获取PyQt QGraphicsTextItem不透明区域,python,pyqt5,qgraphicstextitem,Python,Pyqt5,Qgraphicstextitem,self.boundingRect()给我图中所示的虚线尺寸。我需要获得不透明区域(实际文本绘制的地方) 我试着去 self.opaqueArea() 但它返回QPainterPath对象,它看起来相当复杂,显然没有宽度或高度函数等作为复杂路径对象的表示。有没有更简单的计算方法。有什么想法吗。。提前谢谢 输出: TEXT BOUNDING RECT: PyQt5.QtCore.QRectF(0.0, 0.0, 590.0, 56.0) TEXT OPAQUE AREA : PyQt5.Qt
self.boundingRect()
给我图中所示的虚线尺寸。我需要获得不透明区域(实际文本绘制的地方)
我试着去
self.opaqueArea()
但它返回QPainterPath对象,它看起来相当复杂,显然没有宽度或高度函数等作为复杂路径对象的表示。有没有更简单的计算方法。有什么想法吗。。提前谢谢
输出:
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()
访问此文件。文本文档有一个,它返回一个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中没有内置的裁剪功能。我尝试了这个方法,document().size()返回相同的边界框。实际上我想得到蓝色矩形的尺寸,我突出显示了,我明白了,这不是不透明的,但这仍然是最小的区域,在这里绘图。@lala这很奇怪。我已经用另一个选项更新了答案,该选项获得了画师路径的边界矩形。感谢帮助,我编辑了问题并将代码/输出也放在那里。另外,如果您好奇,为什么我需要这样做,ffmpeg渲染(textfilter)对文本进行了这样的处理。所以我想到的第二个选择是根据字体大小百分比添加偏移量,以接近像素的完美程度。@lala再次更新,越来越接近。也许足够近?
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_()