python GUI库图形界面开发之PyQt5拖放控件实例详解

yizhihongxing

对于“python GUI库图形界面开发之PyQt5拖放控件实例详解”的完整攻略,可以按照以下步骤进行:

1. PyQt5拖放控件简介

首先,需要简要介绍一下PyQt5拖放控件的概念和作用。拖放控件是指用户在界面上通过鼠标点选并拖拽某个控件,然后将其放置到目标控件上的一种交互方式。在PyQt5中,拖放控件主要由QDragQDropEvent两个类实现,其作用通常包括:

  • 实现自定义拖放请求,并在拖放开始前对拖动物体进行处理
  • 在拖拽时显示一些拖拽效果,比如拖拽过程中鼠标的形状、拖拽位置的图标或预览等
  • 通过QDropEvent事件接收已经落入进来的QDrag对象,并对其进行处理

2. 实现基本的拖放功能

接下来,我们将具体实现一个简单的拖放控件功能。假设我们有两个QListWidget控件,其中一个控件为拖动源,另一个控件为拖动目标。我们需要实现拖动源QListWidget中的文字选项,然后将其拖动到目标QListWidget控件中。

首先,需要实现前述QDragQDropEvent的子类,以完成拖动与接收操作。代码如下:

class myQDrag(QDrag):
    def __init__(self, parent):
        super().__init__(parent)

    def update_image(self):
        print("update_image")
        pixmap = self.pixmap()
        painter = QPainter(pixmap)
        painter.setPen(QPen(Qt.red, 4))
        painter.drawRect(pixmap.rect())
        painter.end()
        self.setPixmap(pixmap)

    def mousePressEvent(self, event):
        print("mousePressEvent")

class myQDropEvent(QDropEvent):
    def __init__(self, event):
        super().__init__(event)

    def update_image(self):
        print("update_image")
        pixmap = self.pixmap()
        painter = QPainter(pixmap)
        painter.setPen(QPen(Qt.red, 4))
        painter.drawRect(pixmap.rect())
        painter.end()
        self.setPixmap(pixmap)

接下来,需要为QListWidget控件设置拖动与接收操作的特性:

class DragWidgetUI(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        # 拖拽相关
        self.setAcceptDrops(True)
        self.drag_item = None
        self.drag_type = None

        self.listWidget.drag_item = None
        self.listWidget.drag_type = None
        self.listWidget.setDragEnabled(True)
        self.listWidget.setDefaultDropAction(Qt.MoveAction)
        self.listWidget.setDropIndicatorShown(True)
        self.listWidget.itemPressed.connect(self.listWidgetItemPressed)
        self.listWidget.itemEntered.connect(self.listWidgetItemEntered)

        self.listWidget_2.drag_item = None
        self.listWidget_2.drag_type = None
        self.listWidget_2.setAcceptDrops(True)
        self.listWidget_2.setDropIndicatorShown(True)
        self.listWidget_2.setDragEnabled(False)
        self.listWidget_2.itemEntered.connect(self.listWidget_2ItemEntered)
        self.listWidget_2.itemDropped.connect(self.listWidget_2ItemDropped)

    # 拖拽动作
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drag_type = "self"
            self.drag_item = self.listWidget.currentItem()

            drag = myQDrag(self.listWidget)
            mime = QMimeData()
            mime.setText(self.drag_item.text())
            drag.setMimeData(mime)
            drag.exec()

    # 接收操作
    def dragEnterEvent(self, event):
        if event.mimeData().hasText():
            self.listWidget_2.drag_item = self.listWidget_2.itemAt(event.pos())
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasText():
            self.listWidget_2.drag_item = self.listWidget_2.itemAt(event.pos())
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if self.listWidget_2.drag_item:
            self.listWidget_2.drag_item.setText(event.mimeData().text())
            self.listWidget_2.drag_item = None

3. 实现更丰富的拖放控件功能

除了基本的拖放控件功能之外,还可以实现更丰富的拖放控件功能。例如,我们可以实现在拖动控件时实时更新拖动效果的功能,以及在拖拽完成后的目标控件中给定预览效果和修饰效果。

具体实现过程如下:

class DragWidgetUI(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        # 拖拽相关
        self.drag_item = None
        self.drag_type = None

        self.listWidget_2.setAcceptDrops(True)
        self.listWidget_2.setDropIndicatorShown(True)
        self.listWidget_2.setDragEnabled(False)
        self.listWidget_2.itemEntered.connect(self.listWidget_2ItemEntered)
        self.listWidget_2.itemDropped.connect(self.listWidget_2ItemDropped)

    def listWidgetItemPressed(self, item):
        self.drag_type = "self"
        self.drag_item = item

    # 改变拖动时的图标
    def listWidgetItemEntered(self, item):
        if not item:
            return 
        if item != self.listWidget_2.drag_item:
            self.listWidget_2.drag_item = item

        drag = myQDrag(self.listWidget)
        mime = QMimeData()
        mime.setText(self.drag_item.text())
        drag.setMimeData(mime)
        drag.setPixmap(QPixmap(r"images/1.jpg").scaled(QSize(25, 25)))
        drag.update_image()
        drag.exec()

    # 设置拖拽假象
    def listWidget_2ItemEntered(self, item):
        if not item:
            return 
        if item != self.drag_item:
            self.drag_item = item

        self.listWidget_2.drag_item = item
        self.listWidget_2.setCurrentItem(self.listWidget_2.drag_item)

        drag = myQDrag(self.listWidget_2)
        mime = QMimeData()
        mime.setText(self.drag_item.text())
        drag.setMimeData(mime)
        drag.setPixmap(QPixmap(r"images/1.jpg").scaled(QSize(25, 25)))
        drag.update_image()
        drag.exec(Qt.CopyAction | Qt.MoveAction)

    # 定义接收处理函数
    def listWidget_2ItemDropped(self, item):
        if item != self.drag_item:
            self.drag_item.setText(item.text())
            self.drag_item = None
            self.listWidget_2.drag_item = None

至此,我们就成功实现了更丰富的拖放控件功能。

以上便是本篇攻略的核心内容,其中第二部分是实现单纯的拖放控件功能,第三部分是在其基础上进行了更加丰富的功能扩展。在实际操作中,读者可以根据需要进行调整和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python GUI库图形界面开发之PyQt5拖放控件实例详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python自定义时钟类、定时任务类

    下面详细讲解“Python自定义时钟类、定时任务类”的完整攻略。 自定义时钟类 在Python中可以通过继承threading.Thread类来实现自定义时钟类。步骤如下: 定义一个时钟类,继承threading.Thread类,并重写构造方法和run方法,如下所示: import threading import time class Clock(thre…

    python 2023年6月3日
    00
  • pyqt5 使用label控件实时显示时间的实例

    使用label控件实时显示时间,可以通过以下步骤来实现。 借助PyQt5自带的QtCore库和QtWidgets库。QtCore库中的QTimer类提供了定时器,可以每隔一段时间发射一个信号。而QtWidgets库中的QLabel类可以用于显示文本或图片。 创建一个Qt应用程序,这是一个基本的框架。这里我们使用QMainWindow作为窗口。 import …

    python 2023年6月2日
    00
  • Python中使用PIPE操作Linux管道

    Python中使用PIPE操作Linux管道可以实现在Python脚本中调用Linux命令,可以使Python脚本更加灵活和强大。 首先,Python中使用subprocess模块对Linux命令进行调用。具体使用方法为: import subprocess output = subprocess.check_output("Linux命令&quo…

    python 2023年6月6日
    00
  • python 实现汉诺塔游戏

    Python实现汉诺塔游戏 汉诺塔是一种经典的益智游戏,它的规则是将一堆盘子从一个柱子移动到另一个柱子,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。本文将详细讲解如何使用Python实现汉诺塔游戏,包括如何定义函数、如何递归实现等内容。 定义函数 以下是一个使用Python定义汉诺塔函数的示例: def hanoi(n, source, target…

    python 2023年5月15日
    00
  • 如何在Python中查询MongoDB数据库中的数据?

    以下是在Python中查询MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已经了MongoDB数据库,并已经创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导模 在Python中使用pymongo模块连接MongoDB数据库。以下是导入…

    python 2023年5月12日
    00
  • 详解Python IO编程

    详解Python IO编程 什么是IO编程? IO编程全称Input/Output编程,是指程序对磁盘、网络等输入输出设备的编程。 Python中的文件操作 在Python中,我们可以通过以下方式打开文件: file_obj = open(file_name, mode=’r’, encoding=None) 其中,file_name是传入的文件路径,mod…

    python 2023年5月20日
    00
  • Python实现鼠标自动在屏幕上随机移动功能

    Python实现鼠标自动在屏幕上随机移动功能的完整攻略 在本攻略中,我们将介绍如何使用Python实现鼠标自动在屏幕上随机移动的功能。我们将提供两个示例,演示如何使用pyautogui库和pynput库实现这个功能。 步骤1:安装必要的库 在开始之前,我们需要安装必要的库。我们可以使用以下命令来安装这些库: pip install pyautogui pyn…

    python 2023年5月15日
    00
  • 使用 subprocess 在 python 中执行 linux 命令,然后获取结果提示

    【问题标题】:Using subprocess to execute a linux command in python and then grab the resulting prompt使用 subprocess 在 python 中执行 linux 命令,然后获取结果提示 【发布时间】:2023-04-05 22:14:01 【问题描述】: 我正在使用…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部