PySide:无法让QPainter()保存它的状态并在新的paintEvent上恢复它

时间:2011-12-08 01:57:11

标签: python qt pyside

我正在尝试使用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()之后,它也会删除先前生成的行。可能导致这个问题的原因是什么?

2 个答案:

答案 0 :(得分:1)

paintEvent()方法每次调用时都重新绘制整个小部件。之前调用的绘图完全替换为每个未来paintEvent()调用的结果。

如果你想要你描述的效果,你需要累积点并每次绘制它们的整个序列。

来自文档: http://pyside.github.io/docs/pyside/PySide/QtGui/QWidget.html#PySide.QtGui.PySide.QtGui.QWidget.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_())