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

对于“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海龟turtle基础知识大全以及画图集合实例

    Python海龟turtle基础知识大全以及画图集合实例 一、Python海龟turtle基础知识 1.1 简介 Python中的turtle模块是一种在Python中绘制图形的代码库,可以用于教学和艺术创作。 1.2 turtle基本命令 forward(distance):向前移动指定距离 backward(distance):向后移动指定距离 left…

    python 2023年5月14日
    00
  • 利用Python的sympy包求解一元三次方程示例

    下面是利用Python的sympy包求解一元三次方程示例的完整攻略。 环境准备 首先,需要确保在本地计算机上安装好了Python和sympy包。可以使用pip进行安装: pip install sympy 导入sympy包 在Python文件中首先需要导入sympy包: import sympy 定义符号变量 接下来需要定义符号变量,分别代表未知数和常数: …

    python 2023年6月5日
    00
  • Python虚拟机字节码教程之装饰器实现详解

    Python虚拟机字节码教程之装饰器实现详解 什么是Python装饰器 装饰器是一个返回函数的高阶函数,它用于函数的修饰和扩展。通过装饰器我们可以在不改变原函数代码的情况下,对函数的功能进行扩展,比如添加日志、性能分析、权限校验等。 装饰器的基本语法如下: def decorator(func): def wrapper(*args, **kwargs): …

    python 2023年5月13日
    00
  • Python常用时间操作总结【取得当前时间、时间函数、应用等】

    Python常用时间操作总结 在Python中,常见的时间操作有取得当前时间、时间函数、应用等。 取得当前时间 使用datetime模块可以方便地取得当前时间。我们可以通过以下代码来获取当前时间: import datetime now = datetime.datetime.now() print("当前时间为:", now) 代码解析…

    python 2023年6月2日
    00
  • 浅谈Scrapy网络爬虫框架的工作原理和数据采集

    浅谈Scrapy网络爬虫框架的工作原理和数据采集 Scrapy框架概述 Scrapy是一个基于Python的高级网络爬虫框架,它的设计初衷是为了提高网络爬取效率和性能。同时,Scrapy支持多种数据提取和存储方式,包括JSON、XML和CSV等数据格式以及MySQL、MongoDB等多种数据存储方式。 Scrapy框架的工作原理 Scrapy的工作原理和其他…

    python 2023年5月14日
    00
  • 聊聊Python对CSV文件的读取与写入问题

    让我们来聊聊Python对CSV文件的读取与写入问题吧! 什么是CSV文件? CSV是Comma Separated Values(逗号分隔值)的缩写,是一种常用的数据存储格式,在Excel、Google Sheet等软件中也支持导出和导入CSV文件。CSV文件的一行代表一条记录,每个字段通过逗号分隔。 Python如何读取CSV文件? Python中可使用…

    python 2023年6月3日
    00
  • Python打包文件夹的方法小结(zip,tar,tar.gz等)

    下面是Python打包文件夹的方法小结。 概述 在Python中,我们可以使用多种方式来打包文件夹,比如zip、tar、tar.gz等格式。这些打包方式可以方便地将多个文件或文件夹打包成一个文件,以便于传输、备份或分发。下面介绍几种主要的打包方式。 zip格式压缩 zip是一种常见的文件压缩格式,在Python中我们可以通过zipfile模块来实现zip格式…

    python 2023年6月3日
    00
  • python在线编译器的简单原理及简单实现代码

    这里给出一个简单的 Python 在线编译器的实现代码,同时解释一下其简单原理。 简单原理 该在线编译器的原理是将用户在网页上输入的 Python 代码通过 AJAX 请求发送到后台,后台采用 Python 的 exec 函数执行代码,再将执行结果返回给前端进行展示。 通过 Python 的 exec 函数可以执行用户输入的 Python 代码,并且可以捕获…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部