Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1506 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Drag and Drop objets Label dans un QFrame

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Drag and Drop objets Label dans un QFrame

n°1559852
jijiz
Posté le 14-05-2007 à 10:02:25  profilanswer
 

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
mood
Publicité
Posté le 14-05-2007 à 10:02:25  profilanswer
 

n°1560126
jijiz
Posté le 14-05-2007 à 14:48:01  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Drag and Drop objets Label dans un QFrame

 

Sujets relatifs
mousePressEvent Hérité par plusieurs objetsAsocier un trackbar et un label
Récupérer le label d'un Optgroup en javascript ?drag and drop "glisser-deplacer"
[.NET] Libérer de la mémoire sur des objets volumineux[C#] Désactiver le html dans un label
Qules objets sont dragables ?Drag&Drop / Shell Windows
pb drag and drop d'un clip swf chargé avec loadClip 
Plus de sujets relatifs à : Drag and Drop objets Label dans un QFrame


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR