关于Python的PyQt5 – 拖放,下面是一个完整的使用攻略。
什么是PyQt5 – 拖放
PyQt5 – 拖放是一种允许你在GUI应用程序中实现拖放操作的机制。在PyQt5中,我们可以使用QDrag类来控制拖动操作,使用dropEvent()函数来处理拖放操作的接收。
实现过程
在实现拖放操作之前,我们需要定义一个类,该类需要继承自QWidget或者自定义Widget的子类。然后在该类中重新定义鼠标事件(mousePressEvent(), mouseMoveEvent()和mouseReleaseEvent()),并定义一个drag event(拖动事件)来获取我们想要拖动的数据。
第一步:从列表中拖动项目
在该示例中,我们将从QListWidget中拖动项目。假设我们有一个QListWidget对象和一个按钮,点击该按钮将会从QListWidget中选择一个项目并拖动它。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidget, QTreeWidgetItem, QTreeWidget, QDrag, QDialog
from PyQt5.QtGui import QDragEnterEvent, QAction, QIcon
from PyQt5.QtCore import Qt, QMimeData
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.list_widget = QListWidget(self)
self.list_widget.addItem('One')
self.list_widget.addItem('Two')
self.list_widget.addItem('Three')
self.list_widget.addItem('Four')
self.list_widget.move(50, 50)
self.list_widget.setDragEnabled(True) # 设置可以拖动标志
button = QPushButton('Drag', self)
button.move(50, 250)
button.clicked.connect(self.button_clicked)
def button_clicked(self):
item = self.list_widget.currentItem()
if item:
drag = QDrag(self)
mime_data = QMimeData()
mime_data.setText(item.text()) # 设置拖动操作中传递的数据
drag.setMimeData(mime_data)
drag.exec_(Qt.MoveAction) # 开始拖动操作
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
第二步:将拖动的项目放置到指定位置
现在,我们的应用程序可以从QListWidget中拖动项目,现在我们将会定义拖动操作中放置拖拽数据的位置。在该示例中,我们将创建一个QTreeWidget,以便用户把拖拽项目放置在该对象上。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QListWidget, QTreeWidgetItem, QTreeWidget, QDrag, QDialog
from PyQt5.QtGui import QDragEnterEvent, QAction, QIcon
from PyQt5.QtCore import Qt, QMimeData
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.list_widget = QListWidget(self)
self.list_widget.addItem('One')
self.list_widget.addItem('Two')
self.list_widget.addItem('Three')
self.list_widget.addItem('Four')
self.list_widget.move(50, 50)
self.list_widget.setDragEnabled(True) # 设置可以拖动标志
self.tree_widget = QTreeWidget(self)
self.tree_widget.setGeometry(250, 50, 150, 250)
self.tree_widget.setAcceptDrops(True) # 允许该控件接收拖放事件
button = QPushButton('Drag', self)
button.move(50, 250)
button.clicked.connect(self.button_clicked)
def button_clicked(self):
item = self.list_widget.currentItem()
if item:
drag = QDrag(self)
mime_data = QMimeData()
mime_data.setText(item.text()) # 设置拖动操作中传递的数据
drag.setMimeData(mime_data)
drag.exec_(Qt.MoveAction) # 开始拖动操作
def dragEnterEvent(self, event: QDragEnterEvent):
if event.mimeData().hasText():
event.acceptProposedAction()
def dropEvent(self, event):
item = QTreeWidgetItem(self.tree_widget)
item.setText(0, event.mimeData().text()) # 获取拖动操作中的数据
event.acceptProposedAction()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
以上是两个Python的PyQt5拖放的示例,使用QMimeData来传递拖拽数据。通过这些示例代码,我们可以更加深入地掌握PyQt5的拖放机制。
值得注意的是,上面这段拖放的示例都是基于pyqt5窗口程序下使用的,如果需要想在pyqt5中实现拖放的功能,需要在自己的应用程序中根据需求实现dragEnterEvent,dragMoveEvent,dropEvent三个函数,并且要显式地打开控件的拖动标志setDragEnabled(True)。