Drag and Drop objets Label dans un QFrame

Drag and Drop objets Label dans un QFrame - Python - Programmation

Marsh Posté le 14-05-2007 à 10:02:25    

Bonjour à tous et à toutes,
 
Je veux créer Une zone QFrame dans laqulle je rajoute des formes qui doivent supporter le glisser déposer.
 
Voici comment j'ai procédé :
 
++Mes objets que je vais pouvoir glisser déplacer dans ma QFrame :
-class ImageDragable(QtGui.QLabel,object)
-class SquareDragable(QtGui.QLabel,object)
-class CubicDragable(QtGui.QLabel,object)
-class SquareBox(QtGui.QLabel,object)
 
++Ma QFrame :
-class DragWidget(QtGui.QFrame,object)
exemple :  

Code :
  1. dp = SquareDragable(4, 3, "Ben la c'est le nom de la boite", self)
  2.         dp.move(30, 30)
  3.         dp.show()


 
 
Lorsque je définis les fonctions dragEnterEvent dropEvent mousePressEvent dans la QFrame tous mes objets sont soummis à ces fonctions et ça marche ! Je souhaiterais définir ces 3 méthodes dans chacun des objets image, cubic, square et suqarebox, seulement ceci ne marche pas...
 
Voici le code :
 

Code :
  1. from PyQt4 import QtGui, QtCore
  2. import draggableicons_rc, sys
  3. # Display a cubic
  4. class SquareBox(QtGui.QLabel,object):   
  5.     def __init__(self, QP1, parent=None):
  6.         super (SquareBox, self).__init__ (parent)
  7.         self.setAcceptDrops(True)
  8.         image = QtGui.QImage(QP1.x(), QP1.y(),
  9.                                      QtGui.QImage.Format_ARGB32_Premultiplied)       
  10.         self.rect = QtCore.QRectF(QtCore.QPointF(0.,0.), QtCore.QSizeF(QP1.x(),QP1.y()))
  11.        
  12.         # Drawing the main rectangle
  13.         painter = QtGui.QPainter()
  14.         painter.begin(image)
  15.         painter.setRenderHint(QtGui.QPainter.Antialiasing)
  16.         painter.setPen(QtCore.Qt.black)
  17.         painter.drawLine(QtCore.QPointF(0,0),QtCore.QPointF(QP1.x(),0))
  18.         painter.drawLine(QtCore.QPointF(QP1.x(),0),QP1)
  19.         painter.drawLine(QtCore.QPointF(0,QP1.y()),QP1)
  20.         painter.drawLine(QtCore.QPointF(0,0),QtCore.QPointF(0,QP1.y()))
  21.         self.setPixmap(QtGui.QPixmap.fromImage(image))
  22.         painter.end()
  23.        
  24.     def dragEnterEvent(self, event):
  25.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  26.             if (event.source()==self):
  27.                 event.setDropAction(QtCore.Qt.MoveAction)
  28.                 event.accept()
  29.             else:
  30.                 event.acceptProposedAction()
  31.         else:
  32.             event.ignore()
  33.            
  34.     def dropEvent(self, event):   
  35.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  36.             itemData = event.mimeData().data("application/x-dnditemdata" )
  37.             dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
  38.             # pixmap = QtGui.QPixmap(item.data(QtCore.Qt.DecorationRole))
  39.             pixmap = QtGui.QPixmap()
  40.             offset = QtCore.QPoint()           
  41.             dataStream >> pixmap >> offset         
  42.             newIcon = QtGui.QLabel(self)
  43.             newIcon.setPixmap(pixmap)
  44.             newIcon.move(event.pos() - offset)
  45.             newIcon.show()
  46.             newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
  47.             if (event.source() == self):
  48.                 event.setDropAction(QtCore.Qt.MoveAction)
  49.                 event.accept()
  50.             else:
  51.                 event.acceptProposedAction()
  52.                
  53.         else:
  54.             event.ignore()       
  55.     def mousePressEvent(self,event):
  56.         child = self.childAt(event.pos())
  57.         if (not child):
  58.             return
  59.        
  60.         pixmap = child.pixmap()
  61.         itemData = QtCore.QByteArray()   
  62.         dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
  63.         dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
  64.         mimeData = QtCore.QMimeData()
  65.         mimeData.setData("application/x-dnditemdata", itemData)
  66.        
  67.         print "dans la square box"
  68.         drag = QtGui.QDrag(self)
  69.         drag.setMimeData(mimeData)
  70.         drag.setPixmap(pixmap)
  71.         drag.setHotSpot(event.pos() - child.pos())     
  72.         tempPixmap = QtGui.QPixmap(pixmap)
  73.         child.setPixmap(tempPixmap)     
  74.         if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
  75.             child.close()
  76.         else:
  77.             child.show()
  78.             child.setPixmap(pixmap) 
  79. # Display a cubic
  80. class CubicDragable(QtGui.QLabel,object):   
  81.     def __init__(self, QP1, QP2, parent=None):
  82.         super (CubicDragable, self).__init__ (parent)
  83.         self.setAcceptDrops(True)
  84.         # Construct the path
  85.         path = QtGui.QPainterPath()
  86.         path.setFillRule(QtCore.Qt.OddEvenFill)
  87.        
  88.         # Drawing the cubic to gap 2 points           
  89.         if (QP1.x()<QP2.x()):
  90.             # Coordinates of the first control point
  91.             QPc1 = QtCore.QPointF((QP2.x()-QP1.x())/2,QP1.y())
  92.             # Coodinates of the second control point
  93.             QPc2 = QtCore.QPointF((QP2.x()-QP1.x())/2,QP2.y())
  94.         else:
  95.             # Coordinates of the first control point
  96.             QPc1 = QtCore.QPointF((QP1.x()-QP2.x())/2,QP1.y())
  97.             # Coodinates of the second control point
  98.             QPc2 = QtCore.QPointF((QP1.x()-QP2.x())/2,QP2.y())
  99.         path.moveTo(QP1)
  100.         path.cubicTo(QPc1,QPc2,QP2)
  101.         path.closeSubpath()
  102.        
  103.         # Area where the path will be drawn
  104.         image = QtGui.QImage(abs(QP1.x()- QP2.x()), abs(QP1.y()- QP2.y()),
  105.                              QtGui.QImage.Format_ARGB32_Premultiplied)
  106.        
  107.         # Start the painting device
  108.         painter = QtGui.QPainter()
  109.         painter.begin(image)
  110.         painter.setRenderHint(QtGui.QPainter.Antialiasing)
  111.         # Dawing the path of our cubic
  112.         painter.drawPath(path)
  113.         self.setPixmap(QtGui.QPixmap.fromImage(image))
  114.         painter.end()
  115.     def dragEnterEvent(self, event):
  116.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  117.             if (event.source()==self):
  118.                 event.setDropAction(QtCore.Qt.MoveAction)
  119.                 print "on est dans le dragableWidget"
  120.                 event.accept()
  121.             else:
  122.                 event.acceptProposedAction()
  123.         else:
  124.             event.ignore()
  125.            
  126.     def dropEvent(self, event):
  127.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  128.             itemData = event.mimeData().data("application/x-dnditemdata" )
  129.             dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
  130.             pixmap = QtGui.QPixmap()
  131.             offset = QtCore.QPoint()         
  132.             dataStream >> pixmap >> offset           
  133.             newIcon = QtGui.QLabel(self)
  134.             newIcon.setPixmap(pixmap)
  135.             newIcon.move(event.pos() - offset)
  136.             newIcon.show()
  137.             newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
  138.             if (event.source() == self):
  139.                 event.setDropAction(QtCore.Qt.MoveAction)
  140.                 event.accept()
  141.             else:
  142.                 event.acceptProposedAction() 
  143.         else:
  144.             event.ignore()
  145.                    
  146.     def mousePressEvent(self,event):
  147.         child = self.childAt(event.pos())
  148.         if (not child):
  149.             return
  150.         pixmap = child.pixmap()
  151.         itemData = QtCore.QByteArray()   
  152.         dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
  153.         dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
  154.         mimeData = QtCore.QMimeData()
  155.         mimeData.setData("application/x-dnditemdata", itemData)
  156.         print "entrer dans le cubic dragable"
  157.         drag = QtGui.QDrag(self)
  158.         drag.setMimeData(mimeData)
  159.         drag.setPixmap(pixmap)
  160.         drag.setHotSpot(event.pos() - child.pos())
  161.         tempPixmap = QtGui.QPixmap(pixmap)       
  162.         child.setPixmap(tempPixmap)
  163.        
  164.         if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
  165.             child.close()
  166.         else:
  167.             child.show()
  168.             child.setPixmap(pixmap) 
  169.            
  170. # Display a square
  171. # Parameters : width, height
  172. class SquareDragable(QtGui.QLabel,object):
  173.     def __init__(self, input, output, text, parent=None):
  174.         super (SquareDragable, self).__init__ (parent)
  175.         #QtGui.QLabel.__init__(self, parent)
  176.         self.setAcceptDrops(True)
  177.         # parameters of the bloc; depends of the number of input and output
  178.        
  179.         # max between input and output variables
  180.         m = max(input,output)
  181.         sizeLittleSquare = 10
  182.        
  183.         # size of the bloc in function on the m
  184.         width = QtCore.QString(text).size()*7
  185.         height = m*30+sizeLittleSquare*input
  186.        
  187.         # QString object from the text parameter
  188.         QStringText = QtCore.QString(text)
  189.        
  190.         image = QtGui.QImage(width+2, height+2,
  191.                              QtGui.QImage.Format_ARGB32_Premultiplied)
  192.         # Color of the background
  193.         self.rect = QtCore.QRectF(QtCore.QPointF(1,1), QtCore.QSizeF(width,height))
  194.        
  195.         # Drawing the main rectangle
  196.         painter = QtGui.QPainter()
  197.         painter.begin(image)
  198.         painter.setRenderHint(QtGui.QPainter.Antialiasing)
  199.         painter.setBrush(QtCore.Qt.white)
  200.         painter.drawRoundRect(self.rect,10,10)
  201.                    
  202.         # Displaying a text center on the square
  203.         painter.drawText(self.rect, QtCore.Qt.AlignCenter, QStringText)
  204.         self.setPixmap(QtGui.QPixmap.fromImage(image))
  205.         painter.end()
  206.  
  207.     def dragEnterEvent(self, event):
  208.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  209.             if (event.source()==self):
  210.                 event.setDropAction(QtCore.Qt.MoveAction)
  211.                 print "on est dans le dragableWidget"
  212.                 event.accept()
  213.             else:
  214.                 event.acceptProposedAction()
  215.         else:
  216.             event.ignore()
  217.            
  218.     def dropEvent(self, event):   
  219.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  220.             itemData = event.mimeData().data("application/x-dnditemdata" )
  221.             dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
  222.             pixmap = QtGui.QPixmap()
  223.             offset = QtCore.QPoint()
  224.             dataStream >> pixmap >> offset
  225.             newIcon = QtGui.QLabel(self)
  226.             newIcon.setPixmap(pixmap)
  227.             newIcon.move(event.pos() - offset)
  228.             newIcon.show()
  229.             newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
  230.             if (event.source() == self):
  231.                 event.setDropAction(QtCore.Qt.MoveAction)
  232.                 event.accept()
  233.             else:
  234.                 event.acceptProposedAction()
  235.                
  236.         else:
  237.             event.ignore()       
  238.     def mousePressEvent(self,event):
  239.         child = self.childAt(event.pos())
  240.         if (not child):
  241.             return
  242.        
  243.         pixmap = child.pixmap()
  244.         itemData = QtCore.QByteArray()   
  245.         dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
  246.         dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
  247.        
  248.         mimeData = QtCore.QMimeData()
  249.         mimeData.setData("application/x-dnditemdata", itemData)
  250.        
  251.        
  252.         drag = QtGui.QDrag(self)
  253.         drag.setMimeData(mimeData)
  254.         drag.setPixmap(pixmap)
  255.         drag.setHotSpot(event.pos() - child.pos())
  256.        
  257.         tempPixmap = QtGui.QPixmap(pixmap)   
  258.         print "entrer dans le square dragable"
  259.         child.setPixmap(tempPixmap)
  260.        
  261.         if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
  262.             child.close()
  263.         else:
  264.             child.show()
  265.             child.setPixmap(pixmap) 
  266.            
  267. # Display a picture
  268. # Parameters : path (path of the picture
  269. class ImageDragable(QtGui.QLabel,object):
  270.     def __init__(self, path , parent=None):
  271.         super (ImageDragable, self).__init__ (parent)
  272.         self.setAcceptDrops(True)
  273.         carIcon = QtGui.QImage(path)
  274.         self.setPixmap(QtGui.QPixmap.fromImage(carIcon))
  275.     def dragEnterEvent(self, event):
  276.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  277.             if (event.source()==self):
  278.                 event.setDropAction(QtCore.Qt.MoveAction)
  279.                 print "on est dans le dragableWidget"
  280.                 event.accept()
  281.             else:
  282.                 event.acceptProposedAction()
  283.         else:
  284.             event.ignore()
  285.     def dropEvent(self, event):
  286.         if (event.mimeData().hasFormat("application/x-dnditemdata" )):
  287.             itemData = event.mimeData().data("application/x-dnditemdata" )
  288.             dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.ReadOnly)
  289.             # pixmap = QtGui.QPixmap(item.data(QtCore.Qt.DecorationRole))
  290.             pixmap = QtGui.QPixmap()
  291.             offset = QtCore.QPoint()
  292.             dataStream >> pixmap >> offset
  293.             newIcon = QtGui.QLabel(self)
  294.             newIcon.setPixmap(pixmap)
  295.             newIcon.move(event.pos() - offset)
  296.             newIcon.show()
  297.             newIcon.setAttribute(QtCore.Qt.WA_DeleteOnClose)
  298.            
  299.             if (event.source() == self):
  300.                 event.setDropAction(QtCore.Qt.MoveAction)
  301.                 event.accept()
  302.             else:
  303.                 event.acceptProposedAction()
  304.         else:
  305.             event.ignore()       
  306.     def mousePressEvent(self,event):
  307.         child = self.childAt(event.pos())
  308.         if (not child):
  309.             return
  310.        
  311.         pixmap = child.pixmap()
  312.         itemData = QtCore.QByteArray()   
  313.         dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
  314.         dataStream << pixmap << QtCore.QPoint(event.pos() - child.pos())
  315.        
  316.         mimeData = QtCore.QMimeData()
  317.         mimeData.setData("application/x-dnditemdata", itemData)
  318.         print "entrer image dragable"
  319.        
  320.         drag = QtGui.QDrag(self)
  321.         drag.setMimeData(mimeData)
  322.         drag.setPixmap(pixmap)
  323.         drag.setHotSpot(event.pos() - child.pos())
  324.        
  325.         tempPixmap = QtGui.QPixmap(pixmap)               
  326.         child.setPixmap(tempPixmap)
  327.        
  328.         if (drag.start(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction):
  329.             child.close()
  330.         else:
  331.             child.show()
  332.             child.setPixmap(pixmap) 
  333.            
  334. # Frame wich allow to drag and drop objects contained in the frame
  335. class DragWidget(QtGui.QFrame,object):
  336.    
  337.     def __init__(self, parent=None):
  338.         QtGui.QFrame.__init__(self, parent)
  339.         self.setMinimumSize(200, 200)
  340.         self.setFrameStyle(QtGui.QFrame.Sunken | QtGui.QFrame.StyledPanel)
  341.         self.setAcceptDrops(True)
  342.         self.setWindowTitle(self.tr("Objets Dragables" ))
  343.         # ----------------------------
  344.         # Adding of graphicals objects
  345.         # ----------------------------
  346.         # square
  347.         dp = SquareDragable(4, 3, "Ben la c'est le nom de la boite", self)
  348.         dp.move(30, 30)
  349.         dp.show()
  350.        
  351.         cd = CubicDragable(QtCore.QPointF(0,0),QtCore.QPointF(100,75),self)
  352.         cd.move(10,10)
  353.         cd.show()
  354.        
  355.        
  356.         sb = SquareBox(QtCore.QPointF(100,75),self)
  357.         sb.show()
  358.         # picture       
  359.         id = ImageDragable(":/images/car.png", self)
  360.         id.move(10, 10)
  361.         id.show()
  362.              
  363. if __name__ == "__main__":
  364.     app = QtGui.QApplication(sys.argv)
  365.     window = DragWidget()
  366.     window.show()
  367.     sys.exit(app.exec_())


 
 
[B]Merci !!!![/B]


---------------
Mon Feedback: http://forum.hardware.fr/hardwaref [...] m#t2928561
Reply

Marsh Posté le 14-05-2007 à 10:02:25   

Reply

Marsh Posté le 14-05-2007 à 14:48:01    

sinon je peux toujours travailler en definissant des types mime différents pour les objets et traiter les différents comportement dans l'appli principale  qui hérite de QFrame.. mais c'est crade

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed