Hi, I am trying to implement a simple paint like program. I am having mainly two problems:
1. I have an item class inherited from QGraphicsItem and I use QGraphicsScene.addItem() to add it to the scene. However, I can only see the last added item. Although all previous items (when I use QGraphicsScene.items()) are present and their visible properties are true, they are not shown on my scene. This thing only happens when I use addItem() with the class I implemented. If I use addLine() more than once, I can see all items created by that addLine() function. 2.The other problem is when I try to select an item with a left mouse click. I did not implement the mousePressEvent() inside the item class but I implemented the one in scene class. I can get the mouse scenePos() easily and use it to add items. After adding an item, if I use itemAt() function with a new click on the item and scenePos(), it always returns None. I set the flags of the item all true. I am afraid these two problems are related but I could not find a solution. Thanks Aysun Bascetincelik Here is the code: __________________________ #!/usr/bin/env python import sys from PyQt4 import QtCore, QtGui from graphicsForm import Ui_MainWindow class DiagramScene(QtGui.QGraphicsScene): def __init__(self, graphicsView, parent=None): QtGui.QGraphicsScene.__init__(self, QtCore.QRectF(QtCore.QPointF(0,0), QtCore.QPointF(450,350)), parent) self.itemToAdd = 0 self.mode = 0 # 0: add mode, 1:select mode self.view = graphicsView def mousePressEvent(self, mouseEvent): if (mouseEvent.button() != QtCore.Qt.LeftButton): return x = mouseEvent.scenePos().x() y = mouseEvent.scenePos().y() if(self.mode == 0): self.createItem(x, y) elif(self.mode == 1): self.selectItem(x, y) QtGui.QGraphicsScene.mousePressEvent(self, mouseEvent) def createItem(self, x, y): if (self.itemToAdd == 0): self.addItem(MyPoint(x, y)) elif (self.itemToAdd == 1): self.addLine(QtCore.QLineF(x,y,x+50,y+50)) self.update() # self.view.update() # self.view.show() def selectItem(self, x, y): selected = self.itemAt(x,y) print selected if selected: selected.setSelected(True) class StartProgram(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.scene = DiagramScene(self.ui.graphicsView) self.ui.graphicsView.setScene(self.scene) self.ui.pointButton.setChecked(True) self.ui.pathButton.setChecked(False) QtCore.QObject.connect(self.ui.pointButton,QtCore.SIGNAL("clicked()"), self.pointButtonClicked) QtCore.QObject.connect(self.ui.pathButton,QtCore.SIGNAL("clicked()"), self.pathButtonClicked) QtCore.QObject.connect(self.ui.selectButton,QtCore.SIGNAL("clicked()"), self.selectButtonClicked) def pointButtonClicked(self): self.ui.pointButton.setChecked(True) self.ui.pathButton.setChecked(False) self.scene.itemToAdd = 0 #0 is point def pathButtonClicked(self): self.ui.pathButton.setChecked(True) self.ui.pointButton.setChecked(False) self.scene.itemToAdd = 1 #1 is path def selectButtonClicked(self): if self.ui.selectButton.isChecked(): self.scene.mode = 1 else : self.scene.mode = 0 class MyPoint(QtGui.QGraphicsPathItem): pointToDraw = QtCore.QRectF() def __init__(self, x, y, parent=None, scene=None): super(MyPoint, self).__init__() self.x = x self.y = y MyPoint.pointToDraw.setCoords(x,y, x+15,y+15) self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) def paint(self, painter, option, widget=None): if self.isSelected(): painter.setBrush(QtGui.QBrush(QtGui.QColor(0,255,255))) else: painter.setBrush(QtGui.QBrush(QtGui.QColor(0,0,255))) painter.drawRect(MyPoint.pointToDraw) def path(self): path = QtGui.QPainterPath() path.addEllipse(MyPoint.pointToDraw) #to add ellipse?!?!?!?!? return path if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = StartProgram() myapp.show() sys.exit(app.exec_()) __________________________
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt