且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PyQt5:通过单击QPushButton画一条线

更新时间:2023-01-18 10:12:11

您不应直接调用 paintEvent 方法,此方法应由Qt处理,因为除了您要GUI所需的内容之外,在其他情况下重新绘制它,例如在调整窗口小部件的大小,移动等时.接收到 paintEvent 的事件是一个 QPaintEvent 返回一个需要重新绘制的矩形,这是优化重绘,有时很简单,因为在这种情况下,没有必要使用它.

You should not call the paintEvent method directly, this should be handled by Qt because in addition to what you want the GUI needs to repaint it on other occasions like when the widget is resized, moved, etc. the event that receives paintEvent is a QPaintEvent returns a rectangle where it is required to repaint, this is to optimize the redrawing, sometimes simple as in this case it is not necessary to use it.

paintEvent 方法中,您必须在不为空的情况下绘制该线,因此,在连接到单击信号的插槽中应该执行的操作是用有效的那条线替换该空的线.,并使用 update()方法强制调用 paintEvent ,该方法通知GUI需要重新绘制.

In the paintEvent method you must draw the line when it is not null, so what you should do in the slot that connects to the clicked signal, is to replace that null line with a valid one, and force paintEvent to be called using the update() method that notifies the GUI that it needs to be repainted.

import sys
from PyQt5.QtWidgets import QMainWindow,QPushButton, QApplication
from PyQt5.QtCore import QSize, Qt, QLine, QPoint
from PyQt5.QtGui import QPainter, QPen

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(300, 300)) 

        pybutton = QPushButton('button', self)
        pybutton.clicked.connect(self.draw_line)
        pybutton.resize(100,100)
        pybutton.move(100, 100) 
        self.line = QLine()

    def draw_line(self):
        button = self.sender()
        self.line = QLine(QPoint(), button.pos())
        self.update()

    def paintEvent(self,event):
        QMainWindow.paintEvent(self, event)
        if not self.line.isNull():
            painter = QPainter(self)
            pen = QPen(Qt.red, 3)
            painter.setPen(pen)
            painter.drawLine(self.line)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())