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()方法就可以了。

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实现拖放功能

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

来源:https://blog.csdn.net/baidu_34045013/article/details/52136207

标签:PyQt5,拖放
0
投稿

猜你喜欢

  • 详解如何通过Mysql的二进制日志恢复数据库数据

    2024-01-19 11:33:43
  • 运用PyTorch动手搭建一个共享单车预测器

    2022-10-20 06:25:04
  • python用for循环求和的方法总结

    2023-11-03 16:52:39
  • 用python脚本24小时刷浏览器的访问量方法

    2022-07-16 18:21:33
  • MySQL 中查找含有目标字段的表的方法

    2024-01-12 16:45:20
  • 默认Web字体样式

    2009-11-24 12:37:00
  • 对pycharm 修改程序运行所需内存详解

    2022-10-23 09:14:58
  • python Dataframe 合并与去重详情

    2022-08-17 02:18:54
  • 详解MySql的慢查询分析及开启慢查询日志

    2024-01-18 12:56:56
  • MYSQL开启远程访问权限的方法

    2024-01-14 02:17:04
  • 通过yum方式安装mySql数据库的全过程

    2024-01-13 11:46:43
  • JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)

    2013-08-09 10:14:56
  • Python的命令行参数实例详解

    2023-06-11 09:05:45
  • 五种提高 SQL 性能的方法

    2008-05-16 10:40:00
  • Python 调用 zabbix api的方法示例

    2021-07-15 02:35:09
  • Python基础常用内建函数图文示例解析

    2022-05-04 04:54:24
  • 详解torch.Tensor的4种乘法

    2023-08-11 21:09:03
  • js实现一个日期联动下拉菜单

    2007-08-04 20:49:00
  • 调试一段PHP程序时遇到的三个问题

    2023-06-22 11:39:22
  • 浅析Python 字符编码与文件处理

    2021-09-27 05:30:09
  • asp之家 网络编程 m.aspxhome.com