Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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 在使用QPolygonF进行绘图时,如何在QGraphicsPolygonItem中添加文本?_Python_Pyqt - Fatal编程技术网

Python 在使用QPolygonF进行绘图时,如何在QGraphicsPolygonItem中添加文本?

Python 在使用QPolygonF进行绘图时,如何在QGraphicsPolygonItem中添加文本?,python,pyqt,Python,Pyqt,我想知道如何在QGraphicsPolygonItem中添加文本? 在我的脚本中,我使用QPolygonF和setPolygon绘制项目,我想知道您是否可以在其中插入文本 我在做一些研究,但我能发现的是,有些人使用QGraphicsTextItem而不是多边形项,或者使用QPainter,我不知道如何与我的QPolygonF结合。有人能给我建议如何解决我的问题吗 编辑: 很抱歉没有提供任何示例。下面是多边形项的示例- from PySide2.QtGui import QColor, QPoly

我想知道如何在
QGraphicsPolygonItem
中添加文本? 在我的脚本中,我使用
QPolygonF
setPolygon
绘制项目,我想知道您是否可以在其中插入文本

我在做一些研究,但我能发现的是,有些人使用
QGraphicsTextItem
而不是多边形项,或者使用
QPainter
,我不知道如何与我的
QPolygonF
结合。有人能给我建议如何解决我的问题吗

编辑:

很抱歉没有提供任何示例。下面是多边形项的示例-

from PySide2.QtGui import QColor, QPolygonF, QPen, QBrush
from PySide2.QtCore import Qt, QPointF, QPoint
from PySide2.QtWidgets import QDialog, QVBoxLayout, QGraphicsView, QGraphicsScene, QGraphicsPolygonItem, QApplication, \
    QFrame, QSizePolicy

points_list = [[60.1, 19.6, 0.0], [60.1, 6.5, 0.0], [60.1, -6.5, 0.0], [60.1, -19.6, 0.0], [60.1, -19.6, 0.0],
               [20.0, -19.6, 0.0], [-20, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -19.6, 0.0], [-60.1, -6.5, 0.0],
               [-60.1, 6.5, 0.0], [-60.1, 19.6, 0.0], [-60.1, 19.6, 0.0], [-20.0, 19.6, 0.0], [20.0, 19.6, 0.0],
               [60.1, 19.6, 0.0]]


class MainWindow(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent=parent)
        self.create()

    def create(self, **kwargs):
        main_layout = QVBoxLayout()
        graphics = MainGraphicsWidget()
        main_layout.addWidget(graphics)
        self.setLayout(main_layout)


class MainGraphicsWidget(QGraphicsView):
    def __init__(self, parent=None):
        super(MainGraphicsWidget, self).__init__(parent)

        self._scene = QGraphicsScene(backgroundBrush=Qt.gray)
        self.setScene(self._scene)
        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setBackgroundBrush(QBrush(QColor(30, 30, 30)))
        self.setFrameShape(QFrame.NoFrame)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))

        self.testButton = GraphicsButton()
        self._scene.addItem(self.testButton)


class GraphicsButton(QGraphicsPolygonItem):
    def __init__(self, parent=None):
        super(GraphicsButton, self).__init__(parent)
        self.myPolygon = QPolygonF([QPointF(v1, v2) for v1, v2, v3 in points_list])
        self.setPen(QPen(QColor(0, 0, 0), 0, Qt.SolidLine, Qt.FlatCap, Qt.MiterJoin))
        self.setPolygon(self.myPolygon)
        self.setBrush(QColor(220, 40, 30))


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    window = MainWindow()
    window.setGeometry(500, 100, 500, 900)
    window.show()
    sys.exit(app.exec_())
所以这里应该是红方块一样的项目在中心,有人知道如何把一些文字内

下面是我想要获得的形状和文本的屏幕截图:

最简单的解决方案是添加图形项的子项。
对于矩形等简单形状,然后可以将项目放置在项目的中心。记住,文本不会考虑父项的形状,而你必须以某种方式来处理它。这意味着你必须考虑文本宽度和高度,以及父项形状(对于不规则形状也是如此,而且对于三角形和旋转方形)也是如此。

如您所见,结果超出父边界:

一种可能的替代方法是使用并设置其:

self.textItem=QGraphicsTextItem(self)
self.textItem.setHtml('我是一个非常大的矩形')
self.textItem.setTextWidth(self.boundingRect().width())
rect=self.textItem.boundingRect()
rect.moveCenter(self.boundingRect().center())
self.textItem.setPos(rect.topLeft())


请注意,与QGraphicsSimpleTextItem(使用默认黑色进行绘制)相反,QGraphicsTextItem使用小部件的当前调色板窗口文本,该文本从应用程序、视图或之前设置过它的任何视图的父级继承(设置默认文本颜色后,即使调色板已更改,也不会更改该颜色)。

最简单的解决方案是添加图形项的子项。
对于简单形状的矩形,然后可以将该项放置在项目的中心。记住文本不会考虑父项形状,并且必须以某种方式来处理它;这意味着您必须考虑文本宽度和高度以及父项形状。(这适用于不规则形状,但也适用于三角形和旋转正方形)

如您所见,结果超出父边界:

一种可能的替代方法是使用并设置其:

self.textItem=QGraphicsTextItem(self)
self.textItem.setHtml('我是一个非常大的矩形')
self.textItem.setTextWidth(self.boundingRect().width())
rect=self.textItem.boundingRect()
rect.moveCenter(self.boundingRect().center())
self.textItem.setPos(rect.topLeft())


请注意,与QGraphicsSimpleTextItem(使用默认黑色进行绘制)相反,QGraphicsTextItem使用小部件的当前调色板窗口文本,该文本从应用程序、视图或之前设置过它的任何视图的父级继承(一旦设置了默认文本颜色,即使调色板已更改,也不会更改它)。

什么叫“内部”多边形?你可以用不同的多边形放几个例子。谢谢你注意。我添加了一些我如何使用QGraphicsPolygonItem的例子。我想你没有理解我的问题,假设你有一个多边形,它显示了下面的图像:,文本应该在哪里?你意识到可能有更“复杂的”例如多边形,假设有两个正方形被一个很细很长的矩形连接起来。哦……我明白你的意思了。没有什么复杂的,它更像是简单的正方形、圆、椭圆。最复杂的形状是像手形的东西——文本总是在中心的某个地方——在可读的地方。没有什么像两个分开的sh在这种情况下,除了如何定义内部,或者更好地定义如何计算“内部”的中心位置外,你还必须清楚地定义你称之为“简单”的东西。你称之为“内部”是什么多边形?你可以用不同的多边形放几个例子。谢谢你注意。我添加了一些我如何使用QGraphicsPolygonItem的例子。我想你没有理解我的问题,假设你有一个多边形,它显示了下面的图像:,文本应该在哪里?你意识到可能有更“复杂的”例如多边形,假设有两个正方形被一个很细很长的矩形连接起来。哦……我明白你的意思了。没有什么复杂的,它更像是简单的正方形、圆、椭圆。最复杂的形状是像手形的东西——文本总是在中心的某个地方——在可读的地方。没有什么像两个分开的sh在这种情况下,除了如何定义内部,或者更好地定义如何计算“内部”的中心位置外,你还必须清楚地定义你所谓的“简单”。
class GraphicsButton(QGraphicsPolygonItem):
    def __init__(self, parent=None):
        # ...
        self.textItem = QGraphicsSimpleTextItem('I am a very large rectangle', self)
        rect = self.textItem.boundingRect()
        rect.moveCenter(self.boundingRect().center())
        self.textItem.setPos(rect.topLeft())
        self.textItem = QGraphicsTextItem(self)
        self.textItem.setHtml('<center>I am a very large rectangle</center>')
        self.textItem.setTextWidth(self.boundingRect().width())
        rect = self.textItem.boundingRect()
        rect.moveCenter(self.boundingRect().center())
        self.textItem.setPos(rect.topLeft())