I'm trying to drag and drop a Qlabel on another Qlabel with PyQt5:
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QHBoxLayout, QVBoxLayout, QGridLayout,QFrame, QComboBox, QLabel, QLineEdit
from PyQt5.QtGui import QIcon, QFont, QPixmap, QImage
import sysclass my_label(QLabel):def __init__(self,title,parent):super().__init__(title,parent)self.setAcceptDrops(True)def dragEnterEvent(self,event):if event.mimeData().hasFormat("text/plain"):event.accept()else:event.ignore()def dropEvent(self,event):self.setText(event.mimeData().text())class application(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):label = my_label("drop there",self)label.resize(100,100)label.move(190,65)label_to_drag = QLabel("drag this",self)#label_to_drag.setDragEnabled(True) #doesn't work with QLabel self.show()def closeEvent(self,event):message = QMessageBox.question(self,"Message","Quit ?",QMessageBox.Yes | QMessageBox.No,QMessageBox.No)if message == QMessageBox.Yes:event.accept()else:event.ignore()app = QApplication(sys.argv)
fenetre = application()
sys.exit(app.exec_())
I wanted to make my first label "draggable",by calling the setDragEnabled(True)
method (as i was doing for QLineEdit),and drop it on the second label to change his text. Dropping text from another app is working fine,but I can't find how to drag the QLabel inside my own app...
What did I miss ?
EDIT : modified the code to try to Drag&Drop Images :
class DraggableLabel(QLabel):
def __init__(self,parent,image):super(QLabel,self).__init__(parent)self.setPixmap(QPixmap(image)) self.show()
def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.drag_start_position = event.pos()def mouseMoveEvent(self, event):if not (event.buttons() & Qt.LeftButton):returnif (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():returndrag = QDrag(self)mimedata = QMimeData()mimedata.setText(self.text())drag.setMimeData(mimedata)pixmap = QPixmap(self.size())painter = QPainter(pixmap)painter.drawPixmap(self.rect(), self.grab())painter.end()drag.setPixmap(pixmap)drag.setHotSpot(event.pos())drag.exec_(Qt.CopyAction | Qt.MoveAction)class my_label(QLabel):def __init__(self,title,parent):super().__init__(title,parent)self.setAcceptDrops(True)def dragEnterEvent(self,event):if event.mimeData().hasFormat("text/plain"):print("event accepted")event.accept()else:print("event rejected")event.ignore()def dropEvent(self,event):if event.mimeData().hasImage():self.setPixmap(QPixmap.fromImage(QImage(event.mimeData().imageData())))class application(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):label_to_drag = DraggableLabel(self,"index.jpg")label = my_label("drop there",self)label.resize(100,100)label.move(190,65)self.show()
When I drop the DraggableLabel
(displaying the image) on my_label
,the event is accepted, but hasImage()
always returns false...Is the way I set the image up wrong ?