enter image description here How to implement drag and drop QLabel resize

  • Have your previous questions been resolved? - S. Nick
  • Yes, I forgot to mark, litter - Ivan Kakurkin
  • Please publish an example with QLabel and specify where you want to drag it. - S. Nick
  • Added label drag and place in the GraphicsView and get the coordinates of the label relative to the displayed document in the GV - Ivan Kakurkin

1 answer 1

As an option ( Drag-and-Drop QLabel ):

from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class DraggableLabelImage(QLabel): def __init__(self, image, parent ): super(QLabel,self).__init__(parent) self.setPixmap(QPixmap(image).scaled(100, 100)) 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): return if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance(): return drag = QDrag(self) mimedata = QMimeData() mimedata.setText(self.text()) mimedata.setImageData(self.pixmap().toImage()) 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 DraggableLabel(QLabel): 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): return if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance(): return drag = 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 Widget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): label_to_drag = DraggableLabel("Это QLabel можно перетащить.", self) labelImageDrag = DraggableLabelImage("D:/_Qt/img/head.jpg", self) labelImageDrag.setAlignment(Qt.AlignCenter) layout = QVBoxLayout(self) layout.addWidget(label_to_drag) layout.addWidget(labelImageDrag) class GraphicsProxyWidget(QGraphicsProxyWidget): def __init__(self): super().__init__() self.setAcceptDrops(True) self.label = DropLabel(" Переместите сюда QLabel.text() \n или QLabel.QPixmap(image)") self.setWidget(self.label) def dragEnterEvent(self, event): event.acceptProposedAction() def dropEvent(self, event): return self.widget().dropEvent(event) def dragMoveEvent(self, event): event.acceptProposedAction() class DropLabel(QLabel): def __init__(self, *args, **kwargs): super(DropLabel, self).__init__(*args, **kwargs) self.resize(250,250) self.setAlignment(Qt.AlignCenter) self.setAcceptDrops(True) def dragEnterEvent(self, event): event.acceptProposedAction() def dropEvent(self, event): if event.mimeData().hasUrls(): self.setPixmap(QPixmap(event.mimeData().urls()[0].toLocalFile()).scaled(250, 250)) event.acceptProposedAction() elif event.mimeData().hasImage(): self.setPixmap(QPixmap.fromImage( QImage(event.mimeData().imageData())) ) event.acceptProposedAction() elif event.mimeData().hasText(): text = event.mimeData().text() self.setText(text) event.acceptProposedAction() class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) self.widget = Widget() scene = QGraphicsScene(-20, -20, 290, 290, self) self.view = QGraphicsView(scene) self.view.setBackgroundBrush(QColor(28, 31, 34)) proxy = GraphicsProxyWidget() scene.addItem(proxy) self.layout = QHBoxLayout(self.centralWidget) self.layout.addWidget(self.widget) self.layout.addWidget(self.view) if __name__ == '__main__': import sys app = QApplication(sys.argv) mw = MainWindow() mw.show() sys.exit(app.exec_()) 

enter image description here