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获取Linux系统的各种信息
Jul 10 Python
对于Python装饰器使用的一些建议
Jun 03 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
python循环输出三角形图案的例子
Nov 22 Python
解决Python二维数组赋值问题
Nov 28 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
Python run()函数和start()函数的比较和差别介绍
May 03 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
apache配置虚拟主机的方法详解
2013/06/17 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python完全新手教程
2007/02/08 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python实现调度算法代码详解
2017/12/01 Python
python实现归并排序算法
2018/11/22 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
环保公益广告语
2014/03/13 职场文书
小学生操行评语大全
2014/04/22 职场文书
总经理任命书范本
2014/06/05 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
获奖感言怎么写
2015/07/31 职场文书
初中政治教师教学反思
2016/02/23 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书