PyQt5实现拖放功能
作者:输天半子 发布时间:2023-08-06 11:52:56
在这节教程中,我们将探讨PyQt5中的拖放操作。
在计算机图形用户界面(GUI)中,拖放是在某个虚拟对象上点击并拖动到另一个位置或虚拟对象上的操作。它通常用于调用多个动作,或为两个抽象对象创建某些联系。
拖放是图形用户界面的一部分。拖放可以使用户直观地完成某些复杂的操作。
通常我们可以对两种事物进行拖放操作:数据或某些图形对象。如果我们将某个应用中的图片拖放到另一个应用,我们拖放的是二进制数据。如果将Firefox的某个标签页拖放到其他地方,我们拖放的是一个图形组件。
简单的拖放
在第一个示例中我们要创建一个QLineEdit和一个QPushButton,并通过将LineEdit中的文本拖放到按钮上来改变按钮的标签。
import sys
from PyQt5.QtWidgets import (QPushButton, QWidget, QLineEdit, QApplication)
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("Button", self)
button.move(190, 65)
self.setWindowTitle("Simple drag & drop")
self.setGeometry(300, 300, 300, 150)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
这个示例演示了一个简单的拖放操作。
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True)
我们需要重新实现某些方法才能使QPushButton接受拖放操作。因此我们创建了继承自QPushButton的Button类。
self.setAcceptDrops(True)
使该控件接受drop(放下)事件。
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
首先我们重新实现了dragEnterEvent()方法,并设置可接受的数据类型(在这里是普通文本)。
def dropEvent(self, e):
self.setText(e.mimeData().text())
通过重新实现dropEvent()方法,我们定义了在drop事件发生时的行为。这里我们改变了按钮的文字。
edit = QLineEdit('', self)
edit.setDragEnabled(True)
QLineEdit内置了对drag(拖动)操作的支持。我们只需要调用setDragEnabled()方法就可以了。
拖放一个按钮
在下面的示例中我们将演示如何对一个按钮控件进行拖放。
import sys
from PyQt5.QtWidgets import QPushButton, QWidget, QApplication
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())
dropAcion = 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("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_()
我们在窗体中创建了一个QPushButton。如果用鼠标左键点击这个按钮会在控制台中输出'press'消息。我们在这个按钮上实现了拖放操作,可以通过鼠标右击进行拖动。
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
我们从QPushButton派生了一个Button类,并重新实现了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的拖放的数据传输的支持。
dropAction = drag.exec_(Qt.MoveAction)
Drag对象的exec_()方法用于启动拖放操作。
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()方法中,我们要为松开鼠标后的操作进行编码,并完成drop操作。即找出鼠标指针的当前位置,并将按钮移动过去。
e.setDropAction(Qt.MoveAction)
e.accept()
我们定义了drop动作的类型。这里是move动作。
本节教程讲解了拖放操作。
来源:https://blog.csdn.net/baidu_34045013/article/details/52136207


猜你喜欢
- 每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者
- 自动等待及元素执行方法操作元素的一系列方法,只要调用了测试夹函数page,就能引出操作元素的方法:import pytestfrom pla
- 1.分包背景这里首先介绍下MultiDex的产生背景。当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的
- 如何进行 Python 性能优化,是本文探讨的主要问题。本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希
- 前言原文:A gentle introduction to generics in Go byDominik Braun万俊峰Kevin:我
- 在进行python的开发过程中一直倡导使用虚拟环境来进行项目隔离,这样不会因为python的包不同而导致各种问题,但是以往为了图省事简单,安
- 概率论啊概率论,差不多忘完了。基于概率论的分类方法:朴素贝叶斯1. 概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称
- 开发工具**Python版本:**3.6.4相关模块:scikit-learn模块;jieba模块;numpy模块;以及一些Python自带
- v-model的基本用法一、本节说明前面的章节我们学习了v-bind指定,可以通过模型数据去影响视图。我们都知道VUE是支持双向数据绑定的,
- 一、 了解postman1. 什么是postman?------ 软件测试用来做接口测试的工具。2. 如何下载postman--
- /************************************************************ * Code
- 写此篇文章,我花10块购买了域名ssw.ski。目的是编写python脚本,通过dnspod api获取个人域名内的dns解析记录,免登录实
- 对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。这种方法已经存在了 200 多年,并得到了广泛研究,但仍然是
- 毫无疑问,JavaScript 是一种非常灵活的脚本语言,有时候它像一只难以驯服的野马——你受益于它的灵活性的同时,也要时刻提防它变得失去控
- 在学习asyncio之前,先理清楚同步/异步的概念:同步是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执
- 前言:不用改掉系统python2.7 ,原来是python2.7,我们还进行python2.7的保留1.编译前准备其他库的安装(使用sudo
- 在动态删除iframe时,同时把iframe里嵌套的iframe 删除,遇到了这个问题。本来之前都没报错,突然昨天他们嵌套了一个 跨域 的网
- 需求很简单比如我在做机器学习实验的时候,实验结果的保存路径是'runs/exp'。这样就会出现一个问题:当我第二次运行程序的
- 函数原型参数介绍mode (torch.nn.Module, torch.jit.ScriptModule or torch.jit.Scr
- strIn 为 输入的Email地址字符串变量 返回为true或falsereturn Regex.IsMatch(strIn, @&quo