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 字符串格式化代码
Mar 17 Python
如何运行Python程序的方法
Apr 21 Python
简单介绍Python中的floor()方法
May 15 Python
详解Python的Django框架中的模版继承
Jul 16 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
Python tkinter常用操作代码实例
Jan 03 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
Django serializer优化类视图的实现示例
Jul 16 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 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
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
php socket通信简单实现
2016/11/18 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
JavaScript cookie原理及使用实例
2020/05/08 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
Python实现EM算法实例代码
2020/10/04 Python
Pycharm安装python库的方法
2020/11/24 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
实习生体会的自我评价范文
2013/11/28 职场文书
亲子阅读的活动方案
2014/08/15 职场文书