使用PySide,我构建的作品正是我想要一个可拖动标签:QMimeData:设置和获取正确的MIME类型任意部件
class DraggableLabel(QtGui.QLabel):
def __init__(self, txt, parent):
QtGui.QLabel.__init__(self, txt, parent)
self.setStyleSheet("QLabel { background-color: rgb(255, 255, 0)}")
def mouseMoveEvent(self, event):
drag=QtGui.QDrag(self)
dragMimeData=QtCore.QMimeData()
drag.setMimeData(dragMimeData)
drag.exec_(QtCore.Qt.MoveAction)
(请注意,使用DraggableLabel
下面粘贴一个完整的例子)。不幸的是,我不明白QMimeData
是怎么回事,当我在现实世界的例子中使用类似的代码时,恐怕我会遇到大问题。
特别是,我担心我的mouseMoveEvent
的重新实现创建了一个QMimeData
的实例,没有任何参数传递:QtCore.QMimeData()
。这是正常的吗?如果我在相关的事件处理程序中一直这样做,那么在更复杂的小部件中,我可以确定:程序是否会自动创建用于拖放的正确类型的MIME数据?
我怕我失去了一些东西的原因是因为在Qt Drag and Drop documentation,它具有像行代码:
mimeData -> setText(commentEdit->toPlainText());
这似乎决然不像刚才让程序需要重新实现内处理后事一个事件处理程序。
另外,QMimeData Documentation讨论了测试,获取和设置数据的便利函数,但这些函数用于标准数据类型(例如文本,URL)。我没有找到明确的方法来定义像我的可拖动的QLabel
这样的小部件的便利功能。我错过了吗?有没有一种简单的方法来确定我是否在拖拽一个类型为X的小部件?
编辑:我已经尝试了上面相同的代码比QLabels更复杂的小部件,它不起作用。
可能相关的帖子:
Dragging a QWidget in QT 5
How to Drag and Drop Custom Widgets?
https://stackoverflow.com/questions/18272650/fill-the-system-clipboard-with-data-of-custom-mime-type Python object in QMimeData
重要的警告:如果你只是想移动在一个窗口小部件,你不需要调用深奥的拖放机制,但更多的香草事件处理。看到这个:Dragging/Moving a QPushButton in PyQt。
全部工作自包含的代码,结合上面的例子:
# -*- coding: utf-8 -*-
from PySide import QtGui, QtCore
class LabelDrag(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.initUI()
def initUI(self):
self.lbl=DraggableLabel("Drag me", self)
self.setAcceptDrops(True)
self.setGeometry(40,50,200,200)
self.show()
def dragEnterEvent(self,event):
event.accept()
def dropEvent(self, event):
self.lbl.move(event.pos()) #moves label to position once the movement finishes (dropped)
event.accept()
class DraggableLabel(QtGui.QLabel):
def __init__(self, txt, parent):
QtGui.QLabel.__init__(self, txt, parent)
self.setStyleSheet("QLabel { background-color: rgb(255, 255, 0)}")
def mouseMoveEvent(self, event):
drag=QtGui.QDrag(self)
dragMimeData=QtCore.QMimeData()
drag.setMimeData(dragMimeData)
drag.exec_(QtCore.Qt.MoveAction)
def main():
import sys
qt_app=QtGui.QApplication(sys.argv)
myMover=LabelDrag()
sys.exit(qt_app.exec_())
if __name__=="__main__":
main()
注意我在QtCentre张贴这也将张贴任何有用的东西在那里。
我刚刚添加到帖子中的重要提示:如果您只是想在窗口中移动窗口小部件,则不需要调用深奥的拖放机制,而是更多的香草事件处理。看到这个:http://stackoverflow.com/questions/12219727/dragging-moving-a-qpushbutton-in-pyqt – neuronet