广告
返回顶部
首页 > 资讯 > 精选 >PyQt5如何使用mimeData实现拖拽事件
  • 592
分享到

PyQt5如何使用mimeData实现拖拽事件

2023-06-25 12:06:10 592人浏览 薄情痞子
摘要

小编给大家分享一下PyQt5如何使用mimeData实现拖拽事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现思路简要介绍QMimeData2、QMimeDa

小编给大家分享一下PyQt5如何使用mimeData实现拖拽事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

实现思路

简要介绍QMimeData
2、QMimeData的用例1:在QT实现输入框的文字拖拽
3、QMimeData的用例2:在QT实现按钮拖动

两个用例的实现效果如下:

用例1:

PyQt5如何使用mimeData实现拖拽事件

用例2:

PyQt5如何使用mimeData实现拖拽事件

1、简要介绍QMimeData

一、QDrag

首先是创建QDrag,可以在mousePressEvent、mouseMoveEvent、dragMoveEvent中创建。

QDrag在exec前,一定要设置QMimeData,否则不会开始拖拽操作。

QMimeData在拖拽中非常有用,可以用来保存拖拽操作附带的信息,比如字符串、文件或者图片,同时也可以用来验证其所保存的信息格式,并以此来判断是否可接收。

另外要注意,在windows下,QDrag::exec()是个同步操作,要在exec()返回后,才会继续执行下面的代码。

二、drag相关事件

首先,当需要一个控件接收drag和drop,就要先调用控件的方法:setAcceptDrops(True)。

qt中一共有三个drag相关事件,dragEnterEvent、dragMoveEvent、dragLeaveEvent。这三个事件触发条件类似鼠标移入,鼠标移动,鼠标移出。当鼠标拖拽进入控件触发dragEnterEvent,在控件内拖拽移动触发dragMoveEvent,鼠标拖拽离开控件触发dragLeaveEvent。

三、dropEvent

当drag为accept状态,然后释放鼠标,就会产生dropEvent。我们可以在这个事件里处理本次拖拽附带的Mime信息。

四、拖放关键逻辑图

PyQt5如何使用mimeData实现拖拽事件

2、QMimeData的用例1

在QT实现输入框的文字拖拽

# -*- coding: utf-8 -*-import sysfrom PyQt5.QtCore import Qt, QMimeDatafrom PyQt5.QtGui import QDragfrom PyQt5.QtWidgets import QWidget, QLineEdit, QApplication, QSplitter, QHBoxLayoutclass MyLineEdit(QLineEdit):    def __init__(self, parent):        super().__init__(parent)        self.setAcceptDrops(True)    def dragMoveEvent(self, event):        drag = QDrag(self)        mime = QMimeData()        drag.setMimeData(mime)        drag.exec(Qt.CopyAction)    def dragEnterEvent(self, event):        if event.mimeData().hasText():            event.accept()        else:            event.ignore()    def dropEvent(self, event):        self.setText(event.mimeData().text())        event.source().setText("")class SimpleDrag(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        hlayout = QHBoxLayout(self)        edit1 = MyLineEdit(self)        edit1.setDragEnabled(True)        edit2 = MyLineEdit(self)        edit2.setDragEnabled(True)        splitter = QSplitter(Qt.Horizontal)        splitter.addWidget(edit1)        splitter.addWidget(edit2)        hlayout.addWidget(splitter)        self.setLayout(hlayout)        self.setWindowTitle('简易的拖动事件')if __name__ == '__main__':    app = QApplication(sys.argv)    ex = SimpleDrag()    ex.show()    app.exec_()

关键解析:

在自定义控件中:

我们创建了一个继承自Qt的QLineEdit的输入框

在dragMoveEvent中创建了QDrag,并且设置了drag的mimeData,接着对QDrag调用exec方法

在dragEnterEvent中接收了该事件 即对应代码的 event.accept()

在dropEvent 中 对事件进行了放的处理

在主窗口中:

设置该窗口可以接收拖拽事件setDragEnabled(True)
这就完美对应上面的QMimeData的使用啦

3、QMimeData的用例2

在QT实现按钮拖动

# -*- coding: utf-8 -*-import sysfrom PyQt5.QtWidgets import QPushButton, QWidget, QApplicationfrom PyQt5.QtCore import Qt, QMimeDatafrom PyQt5.QtGui import QDraGClass Button(QPushButton):    def __init__(self, title, parent):        super().__init__(title, parent)    def mouseMoveEvent(self, e):        if e.buttons() != Qt.LeftButton:            return        mimeData = QMimeData()        drag = QDrag(self)        drag.setMimeData(mimeData)        drag.setHotSpot(e.pos() - self.rect().topLeft())        drag.exec_(Qt.MoveAction)class Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()    def initUI(self):        self.setAcceptDrops(True)        self.button = Button('Button', self)        self.button.move(100, 65)        self.setWindowTitle('Click or Move')        self.setGeometry(300, 300, 280, 150)    def dragEnterEvent(self, e):        e.accept()    def dropEvent(self, e):        position = e.pos()        self.button.move(position)        e.setDropAction(Qt.MoveAction)        e.accept()if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    ex.show()    app.exec_()

关键解析:

在自定义控件中:

我们创建了一个继承自Qt的QPushButton的按钮

在mouseMoveEvent中创建了QDrag,并且设置了drag的mimeData,接着对QDrag调用exec方法

在主窗口中:

设置该窗口可以接收拖拽事件setDragEnabled(True)

在dropEvent 中 对事件进行了放的处理,改变按钮的位置

在dragEnterEvent中接收了该事件 即对应代码的 event.accept()

第二个例子跟第一个有点不一样,因为第一个例子中,放的事件给到输入框 MyLineEdit

而第二个例子中,此时接收放事件的控件是主窗口 Example(QWidget)

以上是“PyQt5如何使用mimeData实现拖拽事件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: PyQt5如何使用mimeData实现拖拽事件

本文链接: https://www.lsjlt.com/news/304294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PyQt5如何使用mimeData实现拖拽事件
    小编给大家分享一下PyQt5如何使用mimeData实现拖拽事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现思路简要介绍QMimeData2、QMimeDa...
    99+
    2023-06-25
  • PyQt5怎么使用mimeData实现拖拽事件
    本篇内容介绍了“PyQt5怎么使用mimeData实现拖拽事件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现思路简要介绍QMimeDat...
    99+
    2023-06-25
  • PyQt5使用mimeData实现拖拽事件教程示例解析上
    目录实现思路1、简要介绍QMimeData一、QDrag二、drag相关事件三、dropEvent四、拖放关键逻辑图2、QMimeData的用例1在QT实现输入框的文字拖拽...
    99+
    2022-11-12
  • PyQt5使用mimeData实现拖拽事件教程示例解析下
    目录实现思路1、简要介绍QMimeData2、QMimeData的用例1在QT实现外部文件拖拽并展示3、QMimeData的用例2两个QListWidget之间的item交换系列文章...
    99+
    2022-11-12
  • 怎么使用js实现模拟鼠标拖拽事件
    本篇内容介绍了“怎么使用js实现模拟鼠标拖拽事件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这次的效果图...
    99+
    2022-10-19
  • VUE使用draggable实现组件拖拽
    本文实例为大家分享了draggable组件拖拽实例,供大家参考,具体内容如下 实现步骤 1、导入draggable依赖 npm i -S vuedraggable 2、引入dragg...
    99+
    2022-11-13
  • 拖拽插件sortable.js如何实现el-table表格拖拽效果
    这篇文章将为大家详细讲解有关拖拽插件sortable.js如何实现el-table表格拖拽效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述Sortable.js是一款优秀的js拖拽库,因为是原生...
    99+
    2023-06-29
  • 如何使用HTML5实现拖拽功能
    这篇文章给大家分享的是有关如何使用HTML5实现拖拽功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   问题:突然奇想,想在电影网上加一个收藏(类似于购物车的东西),可以通...
    99+
    2022-10-19
  • 如何使用JavaScript实现拖拽效果
    这篇文章主要介绍如何使用JavaScript实现拖拽效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!拖拽在前端开发中是很常见的功能,也是基本功之一,本文是不限制范围的拖拽也就是最简...
    99+
    2022-10-19
  • react-beautiful-dnd如何实现组件拖拽
    这篇文章将为大家详细讲解有关react-beautiful-dnd如何实现组件拖拽,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.安装在已有react项目中 执行以下命令 so easy。# ...
    99+
    2023-06-20
  • VUE怎么使用draggable实现组件拖拽
    这篇文章主要讲解了“VUE怎么使用draggable实现组件拖拽”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE怎么使用draggable实现组件拖拽”吧!实现步骤1、导入draggab...
    99+
    2023-06-29
  • React如何使用sortablejs实现拖拽排序
    目录React使用sortablejs实现拖拽排序sortablejs之强大的拖拽库安装基本示例常用配置总结React使用sortablejs实现拖拽排序 1、使用npm装包 $ n...
    99+
    2023-01-16
    React使用sortablejs sortablejs实现拖拽排序 sortablejs拖拽排序
  • html5如何使用Drag事件编辑器拖拽上传图片
    小编给大家分享一下html5如何使用Drag事件编辑器拖拽上传图片,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本站的编辑器图片...
    99+
    2022-10-19
  • vue拖拽组件vuedraggable API options如何实现盒子之间相互拖拽排序
    小编给大家分享一下vue拖拽组件vuedraggable API options如何实现盒子之间相互拖拽排序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下...
    99+
    2022-10-19
  • 如何使用Html+css实现拖拽导航条
    小编给大家分享一下如何使用Html+css实现拖拽导航条,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!<!DOCTYPE HTML><html><head&g...
    99+
    2022-10-19
  • html5中如何使用js实现拖拽功能
    这篇文章主要介绍了html5中如何使用js实现拖拽功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. HTML5 拖拽1.1 相关知识拖拽元素:可以为元素添加 dragg...
    99+
    2023-06-09
  • vue3.x如何使用jsplumb实现拖拽连线
    小编给大家分享一下vue3.x如何使用jsplumb实现拖拽连线,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下如果想在vue2里面使用jsplumb ...
    99+
    2023-06-29
  • react拖拽组件react-sortable-hoc如何使用
    这篇“react拖拽组件react-sortable-hoc如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“react...
    99+
    2023-07-05
  • 使用vue自定义如何实现Tree组件和拖拽功能
    目录vue自定义实现Tree组件和拖拽功能vue2 + js版vue2 + ts 版总结vue自定义实现Tree组件和拖拽功能 实现功能:树结构、右键菜单、拖拽 效果图 vue2 ...
    99+
    2022-12-09
    vue自定义Tree组件 vue Tree组件 vue拖拽功能
  • 如何使用HTML和CSS实现拖拽式布局
    拖拽式布局是一种常见且实用的网页布局方式,它允许用户通过鼠标拖拽的方式来调整页面中元素的位置。在本文中,我们将介绍如何使用HTML和CSS来实现这种拖拽式布局,并提供一些具体的代码示例供参考。实现拖拽式布局的关键技术是使用HTML5中的Dr...
    99+
    2023-10-21
    CSS html 拖拽式布局
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作