PyQt5实现拖放功能


Posted in Python onApril 25, 2018

在这节教程中,我们将探讨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()方法就可以了。

PyQt5实现拖放功能

PyQt5实现拖放功能

PyQt5实现拖放功能

拖放一个按钮

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

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动作。

PyQt5实现拖放功能

PyQt5实现拖放功能

本节教程讲解了拖放操作。

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

Python 相关文章推荐
Python collections模块实例讲解
Apr 07 Python
python根据日期返回星期几的方法
Jul 06 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
用python爬取租房网站信息的代码
Dec 14 Python
python儿童学游戏编程知识点总结
Jun 03 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 #Python
wxPython实现窗口用图片做背景
Apr 25 #Python
django 发送手机验证码的示例代码
Apr 25 #Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 #Python
详解tensorflow载入数据的三种方式
Apr 24 #Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 #Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 #Python
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP 裁剪图片
2021/03/09 PHP
js调用flash的效果代码
2008/04/26 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
详解Python3中的 input() 函数
2020/03/18 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
python新手学习可变和不可变对象
2020/06/11 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
大学生专科毕业生自我评价
2013/11/17 职场文书
商场消防安全责任书
2014/07/29 职场文书
技术股东合作协议书
2014/12/02 职场文书
节水倡议书
2015/01/19 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技