PyQt5每天必学之拖放事件

在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()

我们指定放置动作的类型。在当前情况下,它是一个移动动作。

程序执行后

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

您可能感兴趣的文章:

  • PyQt5打开文件对话框QFileDialog实例代码
  • Python PyQt5标准对话框用法示例
  • PyQt5每天必学之事件与信号
  • PyQt5每天必学之切换按钮
  • PyQt5每天必学之滑块控件QSlider
  • PyQt5每天必学之组合框
  • PyQt5每天必学之像素图控件QPixmap
  • PyQt5每天必学之单行文本框
  • PyQt5每天必学之日历控件QCalendarWidget
  • python3+PyQt5+Qt Designer实现扩展对话框
(0)

相关推荐

  • python3+PyQt5+Qt Designer实现扩展对话框

    本文是对<Python Qt GUI快速编程>的第9章的扩展对话框例子Find and replace用Python3+PyQt5+Qt Designer进行改写. 第一部分无借用Qt Designer,完全用代码实现. 第二部分则借用Qt Designer,快速实现. 第一部分: import sys from PyQt5.QtCore import Qt,pyqtSignal from PyQt5.QtWidgets import (QApplication, QCheckBox, QDi

  • PyQt5每天必学之滑块控件QSlider

    QSlider 是一个具有可来回拉动手柄的控件.有时使用滑块比输入数字或使用旋转框更方便. 在我们的例子中,我们将创建一个滑块和一个标签.标签显示图像.滑块将控制标签显示的图像. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子显示了一个QSlider控件的使用方法. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月3日 &quo

  • PyQt5每天必学之单行文本框

    本文实例为大家分享了PyQt5单行文本框展示的具体代码,供大家参考,具体内容如下 QLineEdit 是一个允许输入和编辑纯文本的单行控件.系统中的撤销.重做.复制.剪切和粘贴都可用于该控件. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子中,在QLineEdit中输入的文字实时的在QLabel中显示出来. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowan

  • PyQt5每天必学之组合框

    QComboBox 是一个允许用户从列表选项中选择一项的控件. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子展示了如何使用QComboBox部件. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月4日 """ import sys from PyQt5.QtWidgets import QAppl

  • Python PyQt5标准对话框用法示例

    本文实例讲述了Python PyQt5标准对话框用法.分享给大家供大家参考,具体如下: 很全的Qt的标准对话框,包含QInputDialog.QColorDialog.QFontDialog.QMessageBox.QOpenFileDialog... 全部是由官网的C++版本,转换成PyQt5版本. 有些细节忽略了,因为实在不知怎么转换过来.捣鼓了一晚上,总算完成了,好累啊,不过很开心! 效果图: 完整代码: # -*- coding: utf-8 -*- from PyQt5.QtGui i

  • PyQt5每天必学之事件与信号

    这一部分我们将探索 PyQt5 的事件和信号是如何在应用程序中实现的. Events事件 所有的GUI应用程序都是事件驱动的.应用程序事件主要产生自用户,但它们也可通过其他方法来产生,例如一个互联网连接,一个窗口管理器,或计时器.当我们调用应用程序的exec_()方法,应用程序进入主循环.主循环检测各种事件,并把它们发送到事件对象. 在事件模型中,有三个参与者: event source(事件源) event object(事件对象) event target(事件目标) 事件源是对象的状态改变

  • PyQt5每天必学之像素图控件QPixmap

    QPixmap 像素图控件是用来处理图像的控件之一.它用于将优化后的图像显示在屏幕上.在我们的代码示例中,我们将使用QPixmap 控件在程序窗口上显示图像. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们显示窗口上的图像. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月4日 """ i

  • PyQt5每天必学之切换按钮

    切换按钮是QPushButton的特殊模式.它是一个具有两种状态的按钮:按压和未按压.我们通过这两种状态之间的切换来修改其它内容. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 在这个例子中,我们创建三个切换按钮. 他们将控制一个QFrame的背景颜色. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月3日 ""&q

  • PyQt5每天必学之日历控件QCalendarWidget

    QCalendarWidget 是日历控件.它允许用户以简单和直观的方式选择日期. #!/usr/bin/python3 # -*- coding: utf-8 -*- """ PyQt5 教程 这个例子使用QCalendarWidget控件创建了一个日历. 作者:我的世界你曾经来过 博客:http://blog.csdn.net/weiaitaowang 最后编辑:2016年8月4日 """ import sys from PyQt5.QtWi

  • PyQt5打开文件对话框QFileDialog实例代码

    本文研究的主要是PyQt5打开文件对话框QFileDialog的代码示例,具体如下. 单个文件打开 QFileDialog.getOpenFileName() 多个文件打开 QFileDialog.getOpenFileNames() 文件夹选取 QFileDialog.getExistingDirectory() 文件保存 QFileDialog.getSaveFileName() 实例代码: from PyQt5 import QtWidgets from PyQt5.QtWidgets i

随机推荐