Как рисовать в цвета QtGui.QPainterPath.addRect ()? - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь нарисовать прямоугольник в PyQt5. Но что-то всегда не работает со мной. Я имел в виду «документацию 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 Дополнительный вопрос: Какой самый быстрый способ рисовать и взаимодействовать с примитивами в QGraphicScene? Потому что я вижу там много способов рисовать кривые / многоугольники и манипулировать ими, но что наиболее эффективно для рабочего процесса? Извините за мой английский

1 Ответ

2 голосов
/ 08 апреля 2019

Метод addPath () возвращает QGraphicsPathItem, который наследуется от QAbstractGraphicsShapeItem, который позволяет вам установить цвет заливки и границы с помощью 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 ())

Если вы хотите нарисовать что-то постоянное, с чем вы не хотите взаимодействовать (переместите его, щелкните по нему и т. д.), то вы можете использовать метод drawBackground или drawForeGround изQGraphicsScene, как вы хотите рисовать до или послеЭлементы окрашены соответственно

Для получения дополнительной информации читайте: Графика View Framework

...