PyQt5每天必学之拖放事件
作者:我的世界你曾经来过 发布时间:2021-02-28 19:26:15
在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()方法来激活它。
程序执行后
拖放按钮控件
在下面的例子中,我们将演示如何拖放一个按钮控件。
#!/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()
我们指定放置动作的类型。在当前情况下,它是一个移动动作。
程序执行后
来源:https://blog.csdn.net/weiaitaowang/article/details/52131159
猜你喜欢
- 我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value。可是有时我们需要对dictionary中
- 读取docx文档使用的包是python-docx1. 安装python-docx包sudo pip install python-docx2
- 由于工作需要,所以前一阵子将IE升级到了8.0,结果今天发现出现一个问题,eWebEditor的在线编辑器不好用了,仔细想想,肯定是IE8搞
- 我们知道 Pandas 是数据科学社区中流行的 Python 包,它包含许多函数和方法来分析数据。尽管它的功能对于数据分析来说足够有效,但定
- 越简单越丰富——极简网页设计视觉呈现技巧如何让杂乱又咄咄逼人的网页变得轻薄简洁而美观,又需保留完整功能、同时很好的区分出重点模块?这往往是让
- 一 计算公式:二 实现代码(1)import mathfrom tqdm import tqdmimport timetotal,s,n,t
- 本文实例讲述了python解析xml的方法。分享给大家供大家参考,具体如下:xml是除了json之外另外一个比较常用的用来做为数据交换的载体
- 如下所示:import osos.system()os.popen().read().strip()#上面2种方法 是python 执行终端
- 1、pyqtgraph库数据可视化效果还不错,特别是窗体程序中图像交互性较好;安装也很方便,用 pip 安装。2、在Python中新建一个
- 这篇文章主要介绍了Python爬取豆瓣视频信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一
- zip()的作用先看一下语法:zip(iter1 [,iter2 [...]]) —> zip objectPython的内置help
- 前言谷歌出了一个开源的、跨平台的、可定制化的机器学习解决方案工具包,给在线流媒体(当然也可以用于普通的视频、图像等)提供了机器学习解决方案。
- 1. 利用resnet18做迁移学习import torchfrom torchvision import models if __name
- 函数:split()例子我们想要将以下字符串rule进行拆分。字符串表示的是一个规则,由“…”得到“…”。我们需要将规则中的条件属性与取值分
- 标志是一种简单的工具,就象铁锤,简单实用。如果一种工具功能太多导致其效用减弱,那就让它保持简单。你并不需要一把有太多装饰的精美铁锤。对于象征
- 在使用Django项目中,From表单提交了图片集合var formdata = new FormData();formdata.appen
- 语法: ROW_NUMBER() OVER([ <partition_by_clause>] <order_by_clau
- 1. 表单框类型<!DOCTYPE html><html lang="en"><head&
- 一、scapy简介与安装scapy(http://www.secdev.org/projects/scapy/)是一个强大的交互式数据包处理