Рисование линий и точек в PySide2 с согласованием - PullRequest
0 голосов
/ 03 августа 2020

Я хочу нарисовать несколько линий и точек с помощью PySide2, и я выполнил документацию и предоставил код ниже, но он ничего не показывает после вызова функции.

class Window2(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Deformed Structure")

        self.DrawWindows = QtGui.QWindow()

        self.DrawButton23 = QPushButton('Draw', self)
        self.DrawButton23.setStyleSheet("Background-color: orange")
        self.DrawButton23.move(100, 200)
        self.DrawButton23.show()

        self.DrawButton23.clicked.connect(self.PaintEvent)

    def PaintEvent(self, painter):
        painter = QtGui.QPainter()
        painter.begin(self)
        pen = QPen(Qt.green)
        painter.setPen(pen)

        for i in range(0, 10):
            x0 = i * 30
            y0 = i * 30
            x1 = 100 + i * 50
            y1 = 100 + i * 50
            point1 = QPointF(x0, y0)
            point2 = QPointF(x1, y1)
            line1 = QLineF(point1, point2)
            painter.drawPoint(point1)
            painter.drawLine(line1)
            print("OK123") #Just to check the loop, it prints 10 time

        painter.end()

1 Ответ

1 голос
/ 03 августа 2020

Вы должны понимать, что:

  • Python и C ++ чувствительны к регистру, поэтому paintEvent отличается от PaintEvent.

  • Вы не должны вызывать paintEvent напрямую, но с использованием метода update () или repaint ().

  • Насколько я понимаю, вы хотите, чтобы рисование выполнялось при нажатии кнопки, но вы не можете управлять рисование напрямую, logi c состоит в том, чтобы активировать определенную часть рисунка с помощью какого-либо флага.

Учитывая вышеизложенное, решение:

from PySide2 import QtCore, QtGui, QtWidgets


class Window2(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Deformed Structure")

        self.flag = False

        self.draw_button = QtWidgets.QPushButton("Draw", self)
        self.draw_button.setStyleSheet("Background-color: orange")
        self.draw_button.move(100, 200)

        self.draw_button.clicked.connect(self.on_clicked)

    def on_clicked(self):
        self.flag = True
        self.update()

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)

        if self.flag:
            pen = QtGui.QPen(QtCore.Qt.green)
            painter.setPen(pen)
            for i in range(0, 10):
                x0 = i * 30
                y0 = i * 30
                x1 = 100 + i * 50
                y1 = 100 + i * 50
                point1 = QtCore.QPointF(x0, y0)
                point2 = QtCore.QPointF(x1, y1)
                line1 = QtCore.QLineF(point1, point2)
                painter.drawPoint(point1)
                painter.drawLine(line1)


if __name__ == "__main__":
    app = QtWidgets.QApplication()
    w = Window2()
    w.show()
    app.exec_()
...