我正在尝试使用PySide制作一个非常基本的图像创建器。但是我有些麻烦要画画。
这是我负责绘制区域的脚本部分:
class Area(QWidget):
global x1
global y1
global x2
global y2
try:
x1
except NameError:
x1=0
try:
y1
except NameError:
y1=0
try:
x2
except NameError:
x2=100
try:
y2
except NameError:
y2=100
def mousePressEvent(self, me):
global x1
global y1
x1 = me.x()
y1 = me.y()
def mouseMoveEvent(self, mo):
global x2
global y2
x2 = mo.x()
y2 = mo.y()
self.update()
def paintEvent(self, pe):
global paint
paint = QPainter()
paint.begin(self)
paint.drawLine(x1,y1,x2,y2)
paint.save()
paint.restore()
blankarea = Area()
blankarea.show()
基本上,脚本所做的只是根据鼠标事件绘制一条线。但是,每次鼠标单击事件发生(负责启动一行)时,即使在使用QPainter.save()和QPainter.restore()之后,它也会删除先前生成的行。可能导致这个问题的原因是什么?
答案 0 :(得分:1)
paintEvent()
方法每次调用时都重新绘制整个小部件。之前调用的绘图完全替换为每个未来paintEvent()
调用的结果。
如果你想要你描述的效果,你需要累积点并每次绘制它们的整个序列。
当paint事件发生时,更新区域通常是 擦除,所以你在小部件的背景上画画。
答案 1 :(得分:1)
当你拥有所有graphics view framework 时,为什么要在QWidget
上画画?
简单的线条绘图示例:
from PySide import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.view = View(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.view)
class View(QtGui.QGraphicsView):
def __init__(self, parent):
QtGui.QGraphicsView.__init__(self, parent)
self.setScene(QtGui.QGraphicsScene(self))
self.setSceneRect(QtCore.QRectF(self.viewport().rect()))
def mousePressEvent(self, event):
self._start = event.pos()
def mouseReleaseEvent(self, event):
start = QtCore.QPointF(self.mapToScene(self._start))
end = QtCore.QPointF(self.mapToScene(event.pos()))
self.scene().addItem(
QtGui.QGraphicsLineItem(QtCore.QLineF(start, end)))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())