如何用颜色绘画QtGui.QPainterPath.addRect()?

问题描述 投票:1回答:1

我试图在PyQt5中绘制rect。但总有一些东西不适合我。我指的是“QPainterPath文档”,有这个例子:

path = QPainterPath()
path.addRect(20, 20, 60, 60)

path.moveTo(0, 0)
path.cubicTo(99, 0,  50, 50,  99, 99)
path.cubicTo(0, 99,  50, 50,  0, 0)

QPainter painter(self)
painter.fillRect(0, 0, 100, 100, Qt.white)
painter.setPen(QPen(QColor(79, 106, 25), 1, Qt.SolidLine,
                    Qt.FlatCap, Qt.MiterJoin))
painter.setBrush(QColor(122, 163, 39))

painter.drawPath(path)

我试过自己,但我无法忍受“QPainter painter(self)”及其如何在那里工作,我找不到QPainter命令。这是我的代码示例:

from PyQt5 import QtGui, QtCore, QtWidgets
import sys
class testUi(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(testUi, self).__init__(parent)
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000, 650)

        self.create( )

    def create(self):
        self.setWindowTitle(self.title)
        self.resize(QtCore.QSize(*self.size))
        self.testik = test(self)

        self.mainLayout = QtWidgets.QVBoxLayout( )
        self.mainLayout.addWidget(self.testik)
        self.setLayout(self.mainLayout)


class test(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super(test, self).__init__(parent)
        self._scene = QtWidgets.QGraphicsScene( )
        self.setScene(self._scene)
        self.drawSomething( )

    def drawSomething(self):
        self.path = QtGui.QPainterPath( )
        self.path.moveTo(0, 0)
        self.path.addRect(20, 20, 60, 60)

        self._scene.addPath(self.path)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    v = testUi()
    v.show()
    sys.exit(app.exec_())

我的代码中的“addRect”之后没有写任何东西。那么任何人都可以清楚如何使用“QPainter”。感谢您的时间。

P.S Bonus问题:在QGraphicScene中绘制和与原语交互的最快方法是什么?因为我可以看到很多方法来绘制曲线/多边形并对其进行操作,但对于工作流程来说最有效的方法是什么?对不起我的英语不好

python pyqt pyqt5 qgraphicsview qgraphicsscene
1个回答
2
投票

addPath()方法返回一个继承自QAbstractGraphicsShapeItem的QGraphicsPathItem,它允许您分别使用setBrush()和setPen()设置填充和边框颜色

def drawSomething(self):
    self.path = QtGui.QPainterPath()
    self.path.moveTo(0, 0)
    self.path.addRect(20, 20, 60, 60)
    item = self._scene.addPath(self.path)
    # or
    # item = QtWidgets.QGraphicsPathItem(path)
    # self._scene.addItem(item)
    item.setPen(
        QtGui.QPen(
            QtGui.QColor(79, 106, 25),
            1,
            QtCore.Qt.SolidLine,
            QtCore.Qt.FlatCap,
            QtCore.Qt.MiterJoin,
        )
    )
    item.setBrush(QtGui.QColor(122, 163, 39))

在QGraphicScene中绘制原始图并与之交互的最快方法是什么?因为我可以通过很多方法绘制曲线/多边形并对其进行操作,但是对于工作流程来说最有效的方法是什么?

Qt中的整个绘图系统最终都使用了QPainter,虽然我之前展示的代码没有看到明确的用途,但它正被使用,因为QGraphicsItem有一个使用QPainter,画笔和笔的绘画。

此外,QPainter已经过优化,因此不必担心Qt方面的优化问题。

QGraphicsView和QGraphicsScene是一个基于QGraphicsItems的高级框架,所以一般来说你应该能够使用预定义项构建任何东西,但是如果你不能创建自己的QGraphicsItem(实现方法paint()和boundingRect()) )

如果你想画一些你不想与之交互的东西(移动它,点击它等),那么你可以使用QGraphicsScene的drawBackground或drawForeGround方法,因为你想要在绘制项目之前或之后绘制

欲了解更多信息,请阅读:Graphics View Framework

© www.soinside.com 2019 - 2024. All rights reserved.