在PyQt4教程的这部分中,我们讨论拖放操作。

拖放(Drag-and-drop)指的是图形用户界面(Graphical user interface)中,在一个虚拟的对象上按着鼠标键将之拖曳到另一个地方或另一虚拟对象之上的动作(或是支持着这样的界面的技术)。一般而言,这可以用来产生很多动作,或是在两个抽象对象当中产生各式各样的连接。

拖放操作功能是图形用户界面最明显的方面之一。拖放操作能使用户直观的做复杂的事情。

通常,我们可以拖放两类东西:数据或者一些图形对象。如果我们从一个程序拖动图片到另一个,我们实际拖动了二进制数据。如果我们在Firefox中拖动标签页到另一个地方,我们拖动了一个可视化组件。

简单拖动

在第一个例子中,有一个 QLineEdit 和一个 QPushButton 。我们将从单行编辑器中拖动纯文本到按钮上。

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial This is a simple drag and
drop example. author: Jan Bodnar
website: zetcode.com
last edited: December 2010
""" import sys
from PyQt4 import QtGui class Button(QtGui.QPushButton): def __init__(self, title, parent):
super(Button, self).__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(QtGui.QWidget): def __init__(self):
super(Example, self).__init__() self.initUI() def initUI(self): edit = QtGui.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) def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_() if __name__ == '__main__':
main()

简单拖放操作。

class Button(QtGui.QPushButton):

    def __init__(self, title, parent):
super(Button, self).__init__(title, parent)

为了把文本放到 QPushButton 窗口组件上,必须重新实现一些方法。我们创建自己的 Button 类,从 QPushButton 继承。

self.setAcceptDrops(True)

为窗口组件设置可以接受放入事件。

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() 方法中,我们定义在拖入事件中处理什么任务。这里我们修改按钮的文字。

edit = QtGui.QLineEdit('', self)
edit.setDragEnabled(True)

QLineEdit 窗口组件有内置拖动操作支持,我们需要做的是调用 setDragEnabled 方法并激它。

拖放按钮

在接下来的例子中,我们将演示如何拖放一个按钮窗口组件。

#!/usr/bin/python
# -*- coding: utf-8 -*- """
ZetCode PyQt4 tutorial In this program, we can press
on a button with a left mouse
click or drag and drop the button
with the right mouse click. author: Jan Bodnar
website: zetcode.com
last edited: December 2010
""" import sys
from PyQt4 import QtGui
from PyQt4 import QtCore class Button(QtGui.QPushButton): def __init__(self, title, parent):
super(Button, self).__init__(title, parent) def mouseMoveEvent(self, e): if e.buttons() != QtCore.Qt.RightButton:
return mimeData = QtCore.QMimeData() drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(e.pos() - self.rect().topLeft()) dropAction = drag.start(QtCore.Qt.MoveAction) def mousePressEvent(self, e): QtGui.QPushButton.mousePressEvent(self, e)
if e.button() == QtCore.Qt.LeftButton:
print 'press' class Example(QtGui.QWidget): def __init__(self):
super(Example, self).__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(QtCore.Qt.MoveAction)
e.accept() def main(): app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_() if __name__ == '__main__':
main()

该例子中,在窗口上有一个 QPushButton ,如果我们用鼠标左键按下按钮,在控制台打印“press”。用右键按下并移动按钮,对按钮执行拖放操作。

class Button(QtGui.QPushButton):

    def __init__(self, title, parent):
super(Button, self).__init__(title, parent)

创建一个 Button 类,从 QPushButton 继承。重新实现 QPushButton 的两个方法: mouseMoveEvent()mousePressEvent()mouseMoveEvent() 方法是拖放操作开始的地方。

mimeData = QtCore.QMimeData()

drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(event.pos() - self.rect().topLeft())

创建一个 QDrag 对象。

def mousePressEvent(self, e):

    QtGui.QPushButton.mousePressEvent(self, e)
if e.button() == QtCore.Qt.LeftButton:
print 'press'

如果按下鼠标左键,在控制台打印“press”。注意我们同样调用了父类的 mousePressEvent() 方法,否则我们将看不到按钮被按下。

position = e.pos()

self.button.move(position)

dropEvent() 方法中编写在释放鼠标并且结束拖入操作后将发生什么。找出当前鼠标点的位置并把按钮移到相应位置。

e.setDropAction(QtCore.Qt.MoveAction)
e.accept()

指定拖入动作的类型,这里是移动动作。

在PyQt4教程的这部分中,我们专注于拖放操作。

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4579211.html

读Pyqt4教程,带你入门Pyqt4 _010的更多相关文章

  1. 读Pyqt4教程,带你入门Pyqt4 _009

    QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...

  2. 读Pyqt4教程,带你入门Pyqt4 _005

    对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...

  3. 读Pyqt4教程,带你入门Pyqt4 _004

    在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...

  4. 读Pyqt4教程,带你入门Pyqt4 _003

    编程中的一个重要事情是布局管理,布局管理是如何在窗体上摆放窗口组件.可以有两种方式进行管理:绝对定位或使用布局类. 绝对定位 程序员用像素指定每个控件的位置和尺寸.使用绝对定位时,你必须理解几件事情. ...

  5. 读Pyqt4教程,带你入门Pyqt4 _002

    在这节教程中,我们将创建菜单和工具栏. QMainWindow 类提供应用程序主窗口,可以创建一个经典的拥有状态栏.工具栏和菜单栏的应用程序骨架. 菜单栏 菜单栏是GUI应用程序最明显的部分之一,这是 ...

  6. 读Pyqt4教程,带你入门Pyqt4 _013

    你是否曾经看着应用程序并思考特定的GUI项是如何产生的?大概每位程序员都这样过.然后你能看到你喜欢的GUI库提供的一系列窗口组件,但是你无法找到它.工具包通常仅仅提供最常用的窗口组件,比如按钮.文本组 ...

  7. 读Pyqt4教程,带你入门Pyqt4 _012

    颜色 颜色是指一个代表红(Red).绿(Green).蓝(Blue)(RGB)强度值组合的对象,有效的RGB值在0~255之间.我们可以用多种方式定义颜色,最常用的是RGB十进制或者十六进制值.也可以 ...

  8. 读Pyqt4教程,带你入门Pyqt4 _006

    窗口组件是应用程序的基本构建块.PyQt4编程工具包拥有范围广泛的各种窗口组件.按钮.选择框.滑块.列表框等等,程序员工作所需要的一切.在教程的这部分中,我们将介绍一些有用的窗口组件. QCheckB ...

  9. 读Pyqt4教程,带你入门Pyqt4 _008

    QCalendarWidget QCalendarWidget 提供基于月份的日历窗口组件,它允许用户简单并且直观的选择日期. #!/usr/bin/python # -*- coding: utf- ...

随机推荐

  1. 《C程序设计语言》 练习2-1

    问题描述 编写一个程序以确定分别由signed及unsigned限定的char.short.int及long类型变量的取值范围.采用打印标准头文件中的相应值以及直接计算两种方式实现 Write a p ...

  2. 2020 wannafly camp 补题 day1

    题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...

  3. 记忆化搜索 E - Loppinha, the boy who likes sopinha Gym - 101875E

    E - Loppinha, the boy who likes sopinha Gym - 101875E 这个题目是一个dp,这个应该很容易看出来,但是对于状态的定义其实有点难去想, 看了题解dp[ ...

  4. strut2运行流程的详解

    虽然现在struts2已经慢慢淡出了视野,但是作为一个老框架,在我看来,学习价值还是有的,多阅读框架源码帮助很大,大家有空的话也可以尝试看看,好了,话不多说,今天的主题就像标题写的那样,主要探究str ...

  5. 使用Android studio过程中发现的几个解决R变红的办法

    刚开始使用Android studio的时候,好几次碰见新建了一个xml文件,或者new了一个activity之后,Android studio莫名其妙的报错了,而显示红色的地方就是常用的(R.id. ...

  6. 【编程之美】常用于单片机的接口适配器模式C语言实现

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/128750 ...

  7. Python脚本:实现excel表格导入到数据库,支持mysql,postgresql,MongoDB

    import xlrd,re from datetime import datetime from xlrd import xldate_as_tuple # 判断上传表格是否与模板要求一致 def ...

  8. Java SPI机制简述

    概述 SPI全称Service Provider Interface,是一种为框架提供良好扩展性的机制.一般由框架开发方定义接口规范(如java.sql.Driver),而第三方厂商为之提供自己的实现 ...

  9. 数据库中取出YYYY-mm-dd H:i:s的数据怎么将其转化成YYYY/mm/dd格式,另外,怎么将一个数据表中的数据插入另一个数据表

    sql语句是select  left(replace(rq,'-','/'),10) as rq from 表名 tp5.1中的写法 $res = Db::table('表名') ->field ...

  10. java ->Iterator (迭代)

    Iterator迭代器概述 java中提供了很多个集合,它们在存储元素时,采用的存储方式不同.我们要取出这些集合中的元素,可通过一种通用的获取方式来完成. Collection集合元素的通用获取方式: ...