【发布时间】:2019-07-27 12:50:11
【问题描述】:
我开始使用 PyQt5,我对下面示例中 mimedata 的使用有疑问。
该示例允许通过使用 MainWindow 上的拖放事件来移动 Button。
让我感到困惑的是,在 MyButton 类中,它设置了一个 QmimeData 而没有任何数据设置,然后直接将其传递给 QDrag 对象。
我确实尝试删除 QMimedata 部分,这确实使拖放不再起作用,这似乎是必要的设置。
我的问题是,在这种情况下,这里的 Qmimedata 是什么? 因为从Qmimedata的描述看现在应该是没有数据了,那它是怎么工作的呢?
谢谢!
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class MyButton(QtWidgets.QPushButton):
def __init__(self, parent=None):
super().__init__(parent)
def mouseMoveEvent(self, e):
if e.buttons() != QtCore.Qt.RightButton:
return
mimeData = QtCore.QMimeData()
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(e.pos() - self.rect().topLeft())
drag.exec_(QtCore.Qt.MoveAction)
def mousePressEvent(self, e):
super().mousePressEvent(e)
if e.button() == QtCore.Qt.LeftButton:
print('press')
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = MyButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(220, 180, 331, 151))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Move it"))
class Example(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
e.accept()
def dropEvent(self, e):
position = e.pos()
self.ui.pushButton.move(position)
e.setDropAction(QtCore.Qt.MoveAction)
e.accept()
apps = QtWidgets.QApplication(sys.argv)
ex = Example()
ex.show()
apps.exec_()
【问题讨论】: