【问题标题】:How to get PyQt QGraphicsTextItem opaque area如何获取 PyQt QGraphicsTextItem 不透明区域
【发布时间】:2019-07-10 22:03:30
【问题描述】:

self.boundingRect() 给我图像中显示的虚线尺寸。我需要获得不透明区域(绘制实际文本的位置) 我试着得到 ​​p>

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

【问题讨论】:

    标签: python pyqt5 qgraphicstextitem


    【解决方案1】:

    QGraphicsTextItem 在内部使用QTextDocument 来管理文本。您可以通过.document() 访问它。文本文档有一个size property,它返回一个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 再次更新,越来越近了。也许足够接近?
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2011-05-21
    • 2014-09-04
    相关资源
    最近更新 更多