Пытаюсь разобраться с DragDrop на основе простейшего примера. Хочу сделать перемещение виджета из одного в другой, но все обрывается в момент перемещениям даже в 1 виджете. Я так понял, что виджет не перемещается , если он определен в другом классе, а не в том, где вызывается метод перемещения. Можно ли как-то вызывать перемещение обьекта(but) в классе, где его нет(class Example), из другого класса, в котором он и создается(class MainW)? Ну и главное как сделать так, чтобы можно было переместить обьект из одного виджета в другой?
import sys
from PyQt5.QtWidgets import QPushButton, QWidget, QApplication, QMainWindow, QFrame, QHBoxLayout, QVBoxLayout
from PyQt5.QtCore import Qt, QMimeData, QPoint
from PyQt5.QtGui import QDrag, QColor, QPixmap
class MainW (QMainWindow):
def __init__(self, parent=None):
super(MainW, self).__init__(parent)
self.setupWidgets()
self.setToolTip('self')
self.setWindowTitle('Click or Move')
self.setGeometry(300, 300, 800, 600)
def setupWidgets(self):
self.frame = QFrame()
frameLayout = QHBoxLayout(self.frame)
self.setCentralWidget(self.frame)
self.example1 = Example()
self.example2 = Example()
frameLayout.addWidget(self.example1)
frameLayout.addWidget(self.example2)
frameL = QVBoxLayout(self.frame)
frameL.addLayout (frameLayout)
#Создаю перемещаемую рамку в одной из принимающих рамок
self.but = Button(self.example1)
self.frame.setStyleSheet("QFrame{border-style: outset;border-width: 2px;border-color: black;Background-color: rgb(255,247,191);color: black;}")
#self.setAcceptDrops(True)
# Класс предназначенный для приема перемещаемой рамки
class Example(QFrame):
def __init__(self):
super(Example, self).__init__()
self.setAcceptDrops(True)
self.setMinimumSize(200, 200)
self.setMaximumSize(200, 200)
self.setStyleSheet("QWidget{border-style: outset;border-width: 2px;border-color: black;Background-color: rgb(255,247,191);color: black;}")
def dragEnterEvent(self, e):
e.accept()
def dropEvent(self, event):
position = event.pos()
print ('dropEvent', position)
mimeData = event.mimeData()
print ('dropEvent', event)
# Перемещение закрывает окно
self.but.move(position)
event.setDropAction(Qt.MoveAction)
print ('dropEvent', mimeData)
event.accept()
# Класс перемещаемой рамки
class Button(QFrame):
def __init__(self, parent=None):
super(Button, self).__init__(parent)
self.setMinimumSize(50, 40)
self.setMaximumSize(50, 40)
self.setStyleSheet("QWidget{border-style: outset;border-width: 2px;border-color: black;Background-color: rgb(255,247,191);color: black;}")
def mouseMoveEvent(self, e):
if e.buttons() != Qt.RightButton:
return
mimeData = QMimeData()
drag = QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(e.pos() - self.rect().topLeft())
dropAction = drag.exec_(Qt.MoveAction)
print('rrr', dropAction)
def mousePressEvent(self, e):
QFrame.mousePressEvent(self, e)
if e.button() == Qt.LeftButton:
print('press')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainW()
window.show()
sys.exit(app.exec_())