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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
Python内置函数delattr的具体用法
Nov 23 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
python 有效的括号的实现代码示例
Nov 11 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
python的time模块和datetime模块实例解析
Nov 29 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python类和实例的属性机制原理详解
Mar 21 Python
Python如何定义有可选参数的元类
Jul 31 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 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
PHP中for循环语句的几种变型
2006/11/26 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
php图像验证码生成代码
2017/06/08 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jquery 使用简明教程
2014/03/05 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
质检部部长职责
2013/12/16 职场文书
企业项目策划书
2014/01/11 职场文书
党员岗位承诺书
2014/03/25 职场文书
前台接待岗位职责
2015/02/03 职场文书
团员个人总结
2015/02/26 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
SQL SERVER中的流程控制语句
2022/05/25 SQL Server