Python 在PySide2中绘制线和点,并进行协调

Python 在PySide2中绘制线和点,并进行协调,python,pyside2,qpainter,Python,Pyside2,Qpainter,我想通过PySide2画一些线和点,我遵循文档并在下面提供代码,但在调用函数后它没有显示任何内容 class Window2(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Deformed Structure") self.DrawWindows = QtGui.QWindow() self.DrawButt

我想通过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()

你必须明白:

    <> > Python和C++是区分大小写的,所以PytTeNeX不同于PrtueToviv.

  • 不应直接调用paintEvent,而应使用update()或repaint()方法

  • 据我所知,当你按下按钮时,你希望绘画被执行,但你不能直接控制绘画,逻辑是使用某个标志激活绘画的某个部分

考虑到上述情况,解决方案是:

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

非常感谢你。我现在更新了我的问题。您的代码在单独的文件中工作。然而,它只是画了一条线,似乎“for”循环一步一步地工作,我看到的是最后一个循环图。我对此不确定@莫霍塔:不,这个循环是可行的,但是你的线是共线的,而且它们相交,所以从视觉上看,你好像画了一条线。其次,当我更新我的问题时,你可以看到我有一个主窗口和窗口2。不过,当我将您的代码导入到我的代码中时,第二个窗口会正确地打开“draw_按钮”,但当我按下按钮时,它根本就没有绘图。@MohoTa您读过我的答案了吗?似乎不是。我建议您重新阅读并分析它。对不起,您是对的,我不知道“paintEvent”实际上是一个内置函数。谢谢您的帮助