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


猜你喜欢
- 01 实现我们几乎每个人都用过计算器,大家对于计算器应该都是比较熟悉的,计算器整体也是比较简单的,主要包括:显示器、键盘、运算的逻辑处理等,
- 如何用Sleep函数编译一个定时组件?见下: Private Declare Sub Sleep L
- 本文实例分析了AngularJS框架的ng-app指令与自动加载实现方法。分享给大家供大家参考,具体如下:ng-app是angular的一个
- 最简单的条件语句:if expression: expr_true_suite如上,if是关键字,expression是条件表
- forEach()函数从头到尾把数组遍历一遍。有三个参数分别是:数组元素,元素的索引,数组本身(如果是一个参数就是数组元素,也就是数组的值。
- clipboardData 对象提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用。成员表方法 描述 clearData 通过 dat
- 本文实例讲述了Python排序搜索基本算法之希尔排序。分享给大家供大家参考,具体如下:希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换
- 背景我们经常调侃程序员每天都在写bug,这确实是事实,没有测出bug不代表程序就真的不存在问题。传统的代码review、静态分析、人工测试和
- 一、安装python基础环境:centos7.6安装:下载python:https://www.python.org/ftp/python/
- 总结本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注asp之家的更多内容!来源:https://wcaicai.blog.cs
- MySQL中的锁锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体
- 一、SQLite简介SQLite是一个包含在C库中的轻量级数据库。它并不需要独立的维护进程,并且允许使用非标准变体(nonstandard
- 就我个人经验来讲:除了oracle,没有比HP 客户支持中心更糟糕的体验了。刚买不到一个月的HP MINI笔记本,莫名其妙键盘上的引号键松动
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 18 - Classes part IClass(
- 自动化收集SQLSERVER诊断信息相信很多人都遇到过当SQLSERVER出现问题的时候,而你又解决不了需要DBA或者微软售后支持工程师去帮
- Vue合并el-table第一列相同数据业务需求需要将el-table表格第一列相同的内容进行合并。解决办法el-table中使用 :spa
- 1.使用Qt Design设计一个空白窗口(注意:我是使用MainWindow创建的窗口)2.使用PyUIC将.ui文件转换成.py文件右键
- 本文实例为大家分享了python3实现证件照背景替换的具体代码,供大家参考,具体内容如下import cv2import numpy as
- enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明:函数原型:enumerate(sequence, [s
- Linux 自动备份oracle数据:曾经有个同事,来回操作开发和生产的数据库,结果误删了生产的数据库,那种心情我想不是一般人能理解的,虽然