Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取PyQt QGraphicsTextItem不透明区域_Python_Pyqt5_Qgraphicstextitem - Fatal编程技术网

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