PyQt5每天必学之拖放事件


Posted in Python onAugust 27, 2020

在PyQt5教程的这一部分,我们将讨论拖放操作。

在电脑图形用户界面,拖放事件就是点击一个虚拟对象,并将其拖动到其他位置或到另一个虚拟物体的动作。在一般情况下,它可以被用于调用多种动作,或创建两个抽象对象之间的关联的各种类型。

拖放事件是图形用户界面的一部分。拖放操作使用户能够直观地操作一些复杂的事情。

通常情况下,我们可以拖放两种类型:数据或某些图形对象。如果我们从一个应用程序拖动图像到另一个,我们拖放的是二进制数据。如果我们拖放Firefox标签并将其移动到另一个地方,我们拖放的是图形组件。

简单拖放事件

在这个例子中,我们有一个QLineEdit控件和一个QPushButton控件。我们从单行文本编辑控件中将输入的文本选中后拖到按钮控件上后松开鼠标,按钮的标签将发生变化。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

这是一个简单的拖放例子。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月5日
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)
 self.setAcceptDrops(True)

 def dragEnterEvent(self, e):
 if e.mimeData().hasFormat('text/plain'):
 e.accept()
 else:
 e.ignore()
 def dropEvent(self, e):
 self.setText(e.mimeData().text())

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 edit = QLineEdit('', self)
 edit.setDragEnabled(True)
 edit.move(30, 65)

 button = Button('按钮', self)
 button.move(190, 65)

 self.setGeometry(300, 300, 300, 150)
 self.setWindowTitle('简单拖放') 

if __name__ == '__main__':

 app = QApplication(sys.argv)
 ex = Example()
 ex.show()
 sys.exit(app.exec_())

这个例子介绍了一个简单的拖放操作。

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)
 self.setAcceptDrops(True)

为了在QPushButton控件中显示放置的文字,我们必须将QPushButton控件的一些方法重写。因此,我们创造我们自己的按钮类将从QPushButton类继承。

self.setAcceptDrops(True)

为控件启用拖放事件。

def dragEnterEvent(self, e):
 if e.mimeData().hasFormat('text/plain'):
 e.accept()
 else:
 e.ignore()

首先,重写了dragEnterEvent()方法。告知我们接受的数据类型(text/plain)。通常情况下,它是纯文本。

def dropEvent(self, e):
 self.setText(e.mimeData().text())

接下来重写了dropEvent()方法,这里定义了drop事件将要做的事情。在这里我们改变按钮控件的文本。

edit = QLineEdit('', self)
edit.setDragEnabled(True)

若要启用QLineEdit控件的拖动操作,需要做的是调用setDragEnabled()方法来激活它。

程序执行后

PyQt5每天必学之拖放事件

拖放按钮控件

在下面的例子中,我们将演示如何拖放一个按钮控件。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
PyQt5 教程

在这个程序中,我们可以按上用鼠标左键点击或拖动一个按钮,用鼠标右键单击删除按钮。

作者:我的世界你曾经来过
博客:http://blog.csdn.net/weiaitaowang
最后编辑:2016年8月5日
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QDrag

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)

 def mouseMoveEvent(self, e):
 if e.buttons() != Qt.RightButton:
 return
 mimeData = QMimeData()
 drag = QDrag(self)
 drag.setMimeData(mimeData)
 drag.setHotSpot(e.pos() - self.rect().topLeft())
 drag.exec_(Qt.MoveAction)

 def mousePressEvent(self, e):
 QPushButton.mousePressEvent(self, e)
 if e.button() == Qt.LeftButton:
 print('press')

class Example(QWidget):

 def __init__(self):
 super().__init__()

 self.initUI()

 def initUI(self):

 self.setAcceptDrops(True)

 self.button = Button('按钮', self)
 self.button.move(100, 65)

 self.setGeometry(300, 300, 280, 150)
 self.setWindowTitle('按钮拖放')

 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()
 sys.exit(app.exec_())

在我们的代码示例中,窗口有一个QPushButton 按钮。如果我们用鼠标左键按下按钮,'press' 消息打印到控制台。如果用鼠标右键按住按钮并移动鼠标,程序将执行一个拖放按钮控件事件。

class Button(QPushButton):

 def __init__(self, title, parent):
 super().__init__(title, parent)

创建一个Button 类从QPushButton派生。我们还重写了QPushButton的两种方法:mouseMoveEvent()和mousePressEvent()。该mouseMoveEvent()方法是其中拖放操作开始的地方。

if e.buttons() != Qt.RightButton:
 return

在这里,我们确认执行拖放事件只能使用鼠标右键。鼠标左键被保留用于单击按钮事件。

mimeData = QMimeData()
 drag = QDrag(self)
 drag.setMimeData(mimeData)
 drag.setHotSpot(e.pos() - self.rect().topLeft())

创建QDrag 对象。这个类提供了基于MIME的拖放数据传输的支持。

drag.exec_(Qt.MoveAction)

拖动对象的start()开始方法。

def mousePressEvent(self, e):
 QPushButton.mousePressEvent(self, e)
 if e.button() == Qt.LeftButton:
 print('press')

如果我们使用鼠标左键点击按钮,打印 ‘press' 到控制台。请注意,我们使用mousePressEvent()方法获取鼠标按键信息。

position = e.pos()
self.button.move(position)

在dropEvent()方法中的代码告诉我们,松开鼠标按钮完成拖放操作。找出当前鼠标指针位置并将按钮移动到相应的位置。

e.setDropAction(Qt.MoveAction)
e.accept()

我们指定放置动作的类型。在当前情况下,它是一个移动动作。

程序执行后

PyQt5每天必学之拖放事件PyQt5每天必学之拖放事件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
Mac 上切换Python多版本
Jun 17 Python
python简单实现操作Mysql数据库
Jan 29 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
python中如何使用分步式进程计算详解
Mar 22 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 Python
Python学习开发之图形用户界面详解
Aug 23 Python
sublime python3 输入换行不结束的方法
Apr 19 #Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 #Python
PyQt5每天必学之单行文本框
Apr 19 #Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 #Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 #Python
PyQt5每天必学之带有标签的复选框
Apr 19 #Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 #Python
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
图片按比例缩放函数
2006/06/26 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
vue实现购物车加减
2020/05/30 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python创建日历实例
2014/08/21 Python
介绍Python中几个常用的类方法
2015/04/08 Python
Python版微信红包分配算法
2015/05/04 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
小学三年级学生评语
2014/04/22 职场文书
家庭贫困证明
2014/09/23 职场文书
优秀团员个人总结
2015/02/26 职场文书
湘江北去观后感
2015/06/15 职场文书