PyQt5 – 拖放

  • Post category:Python

关于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)。