Pyqt5-开源工具分解功能(文本拖拽)

简介: Pyqt5-开源工具分解功能(文本拖拽)

开源第四篇:功能实现之拖拽功能与配置文件。

写这个功能的初衷,是因为,每次调试我都要手动敲命令,太麻烦了,想偷个懒,所以直接给这功能加上了,顺便衍生出了另一个想法,配置文件自动填写相关数据。


先看个简单的拖拽功能:

很明显吧,还是比较便捷的。所以我们本章,就在之前的基础上实现这部分功能,一起来看看。


实现拖拽

首先需要知道的是,我们是将QLabel标签拖入到QLineEdit标签中。

知道起手操作了,那么就来实现吧。

第一步-重写父类

from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDragEnterEvent, QDropEvent, QDrag
class DraggableLabel(QLabel):
    def __init__(self, text, parent=None):
        super().__init__(text, parent)
        self.setAcceptDrops(True)
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            drag = QDrag(self)
            mime_data = QMimeData()
            mime_data.setText(self.text())
            drag.setMimeData(mime_data)
            drag.exec_(Qt.CopyAction)

mousePressEvent(self, event):鼠标按下事件处理方法。当用户点击鼠标左键时,创建一个 QDrag 对象,然后创建一个 QMimeData 对象,将标签的文本设置为该 QMimeData 对象的文本数据。最后,使用 exec_ 方法开始拖动操作,使用 Qt.CopyAction 指定拖动操作的类型为复制

class DropLineEdit(QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
    def dragEnterEvent(self, event: QDragEnterEvent):
        if event.mimeData().hasText():
            event.acceptProposedAction()
    def dropEvent(self, event: QDropEvent):
        self.setText(event.mimeData().text())

dragEnterEvent(self, event: QDragEnterEvent):拖入事件处理方法。当有拖动操作进入输入框的范围时,该方法会被触发。在这里,检查拖动事件的 mimeData() 中是否包含文本数据,如果是,则接受拖动操作,允许将数据放置到输入框中

dropEvent(self, event: QDropEvent):拖放事件处理方法。当用户完成拖放操作时,该方法会被触发。在这里,从拖动事件的 mimeData() 中获取文本数据,并将其设置为输入框的文本。

第二步-调用

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.label = DraggableLabel("Drag me", self)
        self.label.setGeometry(20, 20, 100, 30)
        self.line_edit = DropLineEdit(self)
        self.line_edit.setGeometry(20, 70, 200, 30)
        self.setWindowTitle('Drag and Drop Example')
        self.setGeometry(300, 300, 300, 150)
        self.show()

就这样,最后一步实例化这个UI,运行起来就可以看到效果了。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

那么嵌入到工具中呢,如何实现呢。

嵌入到自动化电池监测工具中

第二种实现方式

上面那种实现方式,在已有的UI中不容易嵌入进入,所以换一种是实现方式。

# 拖拽
class DragAndDropFilter(QObject):
    def __init__(self, source_widget, target_widget):
        super().__init__()
        self.source_widget = source_widget
        self.target_widget = target_widget
        self.source_widget.installEventFilter(self)
    def eventFilter(self, obj, event):
        if obj == self.source_widget and event.type() == QEvent.MouseButtonPress:
            if event.button() == Qt.LeftButton:
                mime_data = QMimeData()
                mime_data.setText(self.source_widget.text())
                drag = QDrag(self.source_widget)
                drag.setMimeData(mime_data)
                result = drag.exec_(Qt.MoveAction)
                if result == Qt.MoveAction:
                    return True
        if obj == self.target_widget and event.type() == QEvent.Drop:
            mime_data = event.mimeData().text()
            self.target_widget.setText(mime_data)
            return True
        return super().eventFilter(obj, event)

依旧是重写父类方法,不过实现过程变了,稍微结合了一下。

UI类中如何使用

class BatterySystem(QMainWindow):
    def __init__(self):
        super(BatterySystem, self).__init__()
        # //////////UI_Main
        self.UI = Ui_MainWindow()
        self.UI.setupUi(self)
        # 拖拽
        self.infoCommanddragdrop = DragAndDropFilter(self.UI.infoCommand, self.UI.textEdit_Send)
        self.batCommanddragdrop = DragAndDropFilter(self.UI.batCommand, self.UI.textEdit_Send)

来看看效果

下一章将会讲到根据配置文件将所需要且不长修改的文本信息自动写入到QLineEdit中

目录
相关文章
|
SQL 运维 关系型数据库
使用Binlog日志恢复误删的MySQL数据
今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解到: MySQL的binlog日志是什么?通常是用来干什么的? 模拟一次误删数据的操作,并且使用binlog日志恢复误删的数据。
1952 1
|
3月前
|
NoSQL IDE MongoDB
Studio 3T 2025.13 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.13 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
149 0
|
弹性计算 Prometheus 监控
从自建开源 Prometheus 迁移到阿里云托管 Prometheus 服务
阿里云可观测监控 Prometheus 版提供高性能、高可用、全托管的监控服务,对接开源生态,支持 Kubernetes、ECS 等场景,解决了自建 Prometheus+Thanos 高成本、运维复杂的问题。本文讨论在各个典型场景下的迁移方案。
12355 187
|
JavaScript 前端开发 API
全栈开发革命来临!Vue.js与Node.js联手,打造前后端无缝对接的奇迹之作!
【8月更文挑战第30天】在Web开发领域,前后端分离与协作至关重要。Vue.js以其轻量级和易用性深受前端开发者喜爱,而Node.js则以高性能和事件驱动特性在后端领域崭露头角。二者结合开启了全栈开发新篇章,通过RESTful API或GraphQL实现高效稳定通信。本文以示例说明如何使用Vue.js和Node.js构建全栈应用,从前端Vue组件到后端Express服务器,展示了数据获取与展示的全过程。这种组合提供了一种高效简洁的全栈开发方案,使开发者能更专注于业务逻辑实现。
973 1
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与CUDA:加速深度学习模型训练的最佳实践
【8月更文第27天】随着深度学习应用的广泛普及,高效利用GPU硬件成为提升模型训练速度的关键。PyTorch 是一个强大的深度学习框架,它支持动态计算图,易于使用且高度灵活。CUDA (Compute Unified Device Architecture) 则是 NVIDIA 开发的一种并行计算平台和编程模型,允许开发者直接访问 GPU 的并行计算能力。本文将详细介绍如何利用 PyTorch 与 CUDA 的集成来加速深度学习模型的训练过程,并提供具体的代码示例。
1253 1
|
SQL 数据库连接 数据库
【Python】已完美解决:executemany() takes exactly 2 positional arguments (3 given)
【Python】已完美解决:executemany() takes exactly 2 positional arguments (3 given)
284 6
|
大数据 数据处理 数据中心
x86和x64架构的区别及应用
x86和x64架构的区别及应用
|
机器学习/深度学习 存储 监控
基于YOLOv8的多目标检测与自动标注软件【python源码+PyqtUI界面+exe文件】【深度学习】
基于YOLOv8的多目标检测与自动标注软件【python源码+PyqtUI界面+exe文件】【深度学习】
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
|
Kubernetes 流计算 Docker
要将Flink CDC 3.0部署到Kubernetes上
【1月更文挑战第24天】【1月更文挑战第119篇】要将Flink CDC 3.0部署到Kubernetes上
471 2