My english is quite poor... I prefer inform you about it...
So i would like to draw some pictures (cubic, square, lines) into objects (QLabel), and instanciate those objects into a QFrame. It works, but i would like to make my objects (cubic...) movable, so i want to redefines dragEnterEvent dropEvent and mousePressEven into each of objects wich are QLabel, and it doesn't work.
I thought i could write the dragEnterEvent dropEvent and mousePressEven functions into the QFrame and put a different mime type for cubic, square and lines in order to do specific treatment for each drawable objects but it is piggy.
Can you help me to redefines correctly dragEnterEvent dropEvent and mousePressEven into each of the QLabel objects?
Thank you.
Here the code :
Expand|Select|Wrap|Line Numbers
- # Display a cubic
- class SquareBox(QtGui.QLabel, object):
- def __init__(self, QP1, parent=None):
- super (SquareBox, self).__init__ (parent)
- itemData = QtCore.QByteArray()
- mimeData = QtCore.QMimeData()
- mimeData.setData("application/x-dnditemdata", itemData)
- image = QtGui.QImage(QP1.x(), QP1.y(),
- QtGui.QImage.Format_ARGB32_Premultiplied)
- self.rect = QtCore.QRectF(QtCore.QPointF(0.,0.), QtCore.QSizeF(QP1.x(),QP1.y()))
- # Drawing the main rectangle
- painter = QtGui.QPainter()
- painter.begin(image)
- painter.setRenderHint(QtGui.QPainter.Antialiasing)
- painter.setPen(QtCore.Qt.black)
- painter.drawLine(QtCore.QPointF(0,0),QtCore.QPointF(QP1.x(),0))
- painter.drawLine(QtCore.QPointF(QP1.x(),0),QP1)
- painter.drawLine(QtCore.QPointF(0,QP1.y()),QP1)
- painter.drawLine(QtCore.QPointF(0,0),QtCore.QPointF(0,QP1.y()))
- self.setPixmap(QtGui.QPixmap.fromImage(image))
- painter.end()
- def dragEnterEvent(self, event):
- if (event.mimeData().hasFormat("application/x-dnditemdata")):
- if (event.source()==self):
- event.setDropAction(QtCore.Qt.MoveAction)
- event.accept()
- else:
- event.acceptProposedAction()
- else:
- event.ignore()
- def dropEvent(self, event):
- if (event.mimeData().hasFormat("application/x-dnditemdata")):
- itemData = event.mimeData().data("application/x-dnditemdata")
- dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
- # pixmap = QtGui.QPixmap(item.data(QtCore.Qt.DecorationRole))
- pixmap = QtGui.QPixmap()
- offset = QtCore.QPoint()
- dataStream >> pixmap >> offset
- newIcon = QtGui.QLabel(self)
- newIcon.setPixmap(pixmap)
- newIcon.move(event.pos() - offset)
- newIcon.show()
- newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
- if (event.source() == self):
- event.setDropAction(QtCore.Qt.MoveAction)
- event.accept()
- else:
- event.acceptProposedAction()
- else:
- event.ignore()
- def mousePressEvent(self,event):
- child = self.childAt(event.pos())
- if (not child):
- return
- pixmap = child.pixmap()
- itemData = QtCore.QByteArray()
- dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
- dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
- mimeData = QtCore.QMimeData()
- mimeData.setData("application/x-dnditemdata", itemData)
- print "dans la square box"
- drag = QtGui.QDrag(self)
- drag.setMimeData(mimeData)
- drag.setPixmap(pixmap)
- drag.setHotSpot(event.pos() - child.pos())
- tempPixmap = QtGui.QPixmap(pixmap)
- child.setPixmap(tempPixmap)
- if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
- child.close()
- else:
- child.show()
- child.setPixmap(pixmap)
- # Display a cubic
- class CubicDragable(QtGui.QLabel,object):
- def __init__(self, QP1, QP2, parent=None):
- super (CubicDragable, self).__init__ (parent)
- self.setAcceptDrops(True)
- # Construct the path
- path = QtGui.QPainterPath()
- path.setFillRule(QtCore.Qt.OddEvenFill)
- # Drawing the cubic to gap 2 points
- if (QP1.x()<QP2.x()):
- # Coordinates of the first control point
- QPc1 = QtCore.QPointF((QP2.x()-QP1.x())/2,QP1.y())
- # Coodinates of the second control point
- QPc2 = QtCore.QPointF((QP2.x()-QP1.x())/2,QP2.y())
- else:
- # Coordinates of the first control point
- QPc1 = QtCore.QPointF((QP1.x()-QP2.x())/2,QP1.y())
- # Coodinates of the second control point
- QPc2 = QtCore.QPointF((QP1.x()-QP2.x())/2,QP2.y())
- path.moveTo(QP1)
- path.cubicTo(QPc1,QPc2,QP2)
- path.closeSubpath()
- # Area where the path will be drawn
- image = QtGui.QImage(abs(QP1.x()- QP2.x()), abs(QP1.y()- QP2.y()),
- QtGui.QImage.Format_ARGB32_Premultiplied)
- # Start the painting device
- painter = QtGui.QPainter()
- painter.begin(image)
- painter.setRenderHint(QtGui.QPainter.Antialiasing)
- # Dawing the path of our cubic
- painter.drawPath(path)
- self.setPixmap(QtGui.QPixmap.fromImage(image))
- painter.end()
- def dragEnterEvent(self, event):
- if (event.mimeData().hasFormat("application/x-dnditemdata")):
- if (event.source()==self):
- event.setDropAction(QtCore.Qt.MoveAction)
- print "on est dans le dragableWidget"
- event.accept()
- else:
- event.acceptProposedAction()
- else:
- event.ignore()
- def dropEvent(self, event):
- if (event.mimeData().hasFormat("application/x-dnditemdata")):
- itemData = event.mimeData().data("application/x-dnditemdata")
- dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
- pixmap = QtGui.QPixmap()
- offset = QtCore.QPoint()
- dataStream >> pixmap >> offset
- newIcon = QtGui.QLabel(self)
- newIcon.setPixmap(pixmap)
- newIcon.move(event.pos() - offset)
- newIcon.show()
- newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
- if (event.source() == self):
- event.setDropAction(QtCore.Qt.MoveAction)
- event.accept()
- else:
- event.acceptProposedAction()
- else:
- event.ignore()
- def mousePressEvent(self,event):
- child = self.childAt(event.pos())
- if (not child):
- return
- pixmap = child.pixmap()
- itemData = QtCore.QByteArray()
- dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
- dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
- mimeData = QtCore.QMimeData()
- mimeData.setData("application/x-dnditemdata", itemData)
- print "entrer dans le cubic dragable"
- drag = QtGui.QDrag(self)
- drag.setMimeData(mimeData)
- drag.setPixmap(pixmap)
- drag.setHotSpot(event.pos() - child.pos())
- tempPixmap = QtGui.QPixmap(pixmap)
- child.setPixmap(tempPixmap)
- if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
- child.close()
- else:
- child.show()
- child.setPixmap(pixmap)
- # Frame wich allow to drag and drop objects contained in the frame
- class DragWidget(QtGui.QFrame,object):
- def __init__(self, parent=None):
- QtGui.QFrame.__init__(self, parent)
- self.setMinimumSize(200, 200)
- self.setFrameStyle(QtGui.QFrame.Sunken | QtGui.QFrame.StyledPanel)
- self.setAcceptDrops(True)
- self.setWindowTitle(self.tr("Objets Dragables"))
- # ----------------------------
- # Adding of graphicals objects
- # ----------------------------
- cd = CubicDragable(QtCore.QPointF(0,0),QtCore.QPointF(100,75),self)
- cd.move(10,10)
- cd.show()
- sb = SquareBox(QtCore.QPointF(100,75),self)
- sb.show()
- sb.setAcceptDrops(True)
- help(sb)
- if __name__ == "__main__":
- app = QtGui.QApplication(sys.argv)
- window = DragWidget()
- window.show()
- sys.exit(app.exec_())