在绘制新线后,我无法维护以前绘制的线条。现在,如果我单击一个按钮,它将绘制一条线,但是一旦我单击第二个按钮,就会绘制一条新线并删除初始线。我希望两者都存在。
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(0, 0)
pybutton2 = QPushButton('button2', self)
pybutton2.clicked.connect(self.draw_line)
pybutton2.resize(100,100)
pybutton2.move(200, 0)
self.line = QLine()
def draw_line(self):
button = self.sender()
x = int(button.x()) + int(button.width())/2
y = int(button.y())+100
self.line = QLine(x, y, x, y+100)
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_())
答案 0 :(得分:3)
将QLine
存储在列表中并重绘:
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(0, 0)
pybutton2 = QPushButton('button2', self)
pybutton2.clicked.connect(self.draw_line)
pybutton2.resize(100,100)
pybutton2.move(200, 0)
self.lines = []
def draw_line(self):
button = self.sender()
r = button.geometry()
p1 = QPoint(r.left() + r.width()/2, r.height())
p2 = p1+QPoint(0, 100)
line = QLine(p1, p2)
if line not in self.lines:
self.lines.append(line)
self.update()
def paintEvent(self,event):
QMainWindow.paintEvent(self, event)
painter = QPainter(self)
pen = QPen(Qt.red, 3)
painter.setPen(pen)
for line in self.lines:
painter.drawLine(line)
这些问题已被无数次问过,所以我会花时间扩展并对问题进行一般性的观察,这样我每次都不回答这类问题,所以这个问题 它将得到改进和更新。
paintEvent()
是一个处理Qt以执行重新绘制GUI的方法,此方法重绘所有内容,因此绘图不会节省内存,因此您必须存储指令并制作绘图
这些指示。
我建议使用paintEvent()
方法来创建自定义小部件,而不是将执行绘制任务的GUI作为主要功能,因为此Qt提供了类QGraphicsView
,QGraphicsScene
和QGraphicsItem
秒。
使用QPainter
作为drawLine()
,fillRect()
等的指示重绘的任务消耗资源,如果您想要更有效的实现,则创建{{{ 1}}您必须在必要时进行更新,并使用上述QPixmap
在paintEvent()
中进行重新绘制:
QPixmap