Python 如何使用PyQt更新QGraphicsView中的QPixmap
我试图在QGraphicsView内的QPixmap上绘制。这幅画效果很好,但QGraphicsView没有更新它 以下是一些工作代码:Python 如何使用PyQt更新QGraphicsView中的QPixmap,python,pyqt,repaint,qgraphicsview,qpixmap,Python,Pyqt,Repaint,Qgraphicsview,Qpixmap,我试图在QGraphicsView内的QPixmap上绘制。这幅画效果很好,但QGraphicsView没有更新它 以下是一些工作代码: #!/usr/bin/env python from PyQt4 import QtCore from PyQt4 import QtGui class Canvas(QtGui.QPixmap): """ Canvas for drawing""" def __init__(self, parent=None): QtGu
#!/usr/bin/env python
from PyQt4 import QtCore
from PyQt4 import QtGui
class Canvas(QtGui.QPixmap):
""" Canvas for drawing"""
def __init__(self, parent=None):
QtGui.QPixmap.__init__(self, 64, 64)
self.parent = parent
self.imH = 64
self.imW = 64
self.fill(QtGui.QColor(0, 255, 255))
self.color = QtGui.QColor(0, 0, 0)
def paintEvent(self, point=False):
if point:
p = QtGui.QPainter(self)
p.setPen(QtGui.QPen(self.color, 1, QtCore.Qt.SolidLine))
p.drawPoints(point)
def clic(self, mouseX, mouseY):
self.paintEvent(QtCore.QPoint(mouseX, mouseY))
class GraphWidget(QtGui.QGraphicsView):
""" Display, zoom, pan..."""
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.im = Canvas(self)
self.imH = self.im.height()
self.imW = self.im.width()
self.zoomN = 1
self.scene = QtGui.QGraphicsScene(self)
self.scene.setItemIndexMethod(QtGui.QGraphicsScene.NoIndex)
self.scene.setSceneRect(0, 0, self.imW, self.imH)
self.scene.addPixmap(self.im)
self.setScene(self.scene)
self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QtGui.QGraphicsView.AnchorViewCenter)
self.setMinimumSize(400, 400)
self.setWindowTitle("pix")
def mousePressEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
pos = self.mapToScene(event.pos())
self.im.clic(pos.x(), pos.y())
#~ self.scene.update(0,0,64,64)
#~ self.updateScene([QtCore.QRectF(0,0,64,64)])
self.scene.addPixmap(self.im)
print('items')
print(self.scene.items())
else:
return QtGui.QGraphicsView.mousePressEvent(self, event)
def wheelEvent(self, event):
if event.delta() > 0:
self.scaleView(2)
elif event.delta() < 0:
self.scaleView(0.5)
def scaleView(self, factor):
n = self.zoomN * factor
if n < 1 or n > 16:
return
self.zoomN = n
self.scale(factor, factor)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
widget = GraphWidget()
widget.show()
sys.exit(app.exec_())
#/usr/bin/env python
从PyQt4导入QtCore
从PyQt4导入QtGui
类画布(QtGui.QPixmap):
“”“用于绘图的画布”“”
def uuu init uuu(self,parent=None):
QtGui.QPixmap.\uuuuu init\uuuuuu(self,64,64)
self.parent=parent
self.imH=64
self.imW=64
self.fill(QtGui.QColor(0,255,255))
self.color=QtGui.QColor(0,0,0)
def paintEvent(自身,点=假):
如果点:
p=QtGui.QPainter(自)
p、 setPen(QtGui.QPen(self.color,1,QtCore.Qt.SolidLine))
p、 支取点(点)
def clic(self、mouseX、mouseY):
self.paintEvent(QtCore.QPoint(mouseX,mouseY))
类GraphWidget(QtGui.QGraphicsView):
“”“显示、缩放、平移…””
定义初始化(自):
QtGui.QGraphicsView.\uuuuu init\uuuuuu(self)
self.im=画布(self)
self.imH=self.im.height()
self.imW=self.im.width()
self.zoomN=1
self.scene=QtGui.qgraphicscene(self)
self.scene.setItemIndexMethod(QtGui.qgraphicscene.NoIndex)
self.scene.setscen直立(0,0,self.imW,self.imH)
self.scene.addPixmap(self.im)
self.setScene(self.scene)
self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QtGui.QGraphicsView.AnchorViewCenter)
自设置最小大小(400400)
self.setWindowTitle(“pix”)
def鼠标压力事件(自身、事件):
如果event.buttons()==QtCore.Qt.LeftButton:
pos=self.maptosene(event.pos())
self.im.clic(位置x(),位置y())
#~self.scene.update(0,0,64,64)
#~self.updateScene([QtCore.QRectF(0,0,64,64)])
self.scene.addPixmap(self.im)
打印('项目')
打印(self.scene.items())
其他:
返回QtGui.QGraphicsView.mousePressEvent(self,event)
def wheelEvent(自我,事件):
如果event.delta()大于0:
self.scaleView(2)
elif event.delta()<0:
self.scaleView(0.5)
def scaleView(自身、系数):
n=自缩放*因子
如果n<1或n>16:
返回
self.zoomN=n
自我尺度(因子,因子)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=QtGui.QApplication(sys.argv)
widget=GraphWidget()
widget.show()
sys.exit(app.exec_())
mousePressEvent
在QPixmap上进行一些绘制。但我发现更新显示的唯一解决方案是创建一个新实例(这不是一个好的解决方案)
如何更新它?无法将pixmap链接到场景,该项目使用它的内部副本,因此您必须使用新的pixmap更新
QGraphicsPixmapItem
:
def __init__(self):
...
# save the item as a member
self.imItem = self.scene.addPixmap(self.im)
...
def mousePressEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
pos = self.mapToScene(event.pos())
self.im.clic(pos.x(), pos.y())
self.imItem.setPïxmap(self.im)
...
但是,让类Canvas
从QGraphicsPixmapItem
继承而不是QPixmap
更有意义,您仍然需要使用pixmap()
获取pixmap,在其上绘制,并调用setPixmap
来更新它。作为奖励,该代码将位于item ownmousePressEvent
方法中