Drag & drop a button widget

In the following example, we will demonstrate how to drag & drop a button widget.

#!/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: October 2013
"""

import sys
from PyQt4 import QtCore, QtGui

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):

        super(Button, self).mousePressEvent(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)
        self.show()

    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([])
    ex = Example()
    sys.exit(app.exec_())

if __name__ == ‘__main__‘:
    main()

In our code example, we have a QtGui.QPushButton on the window. If we click on the button with a left mouse button, the ‘press‘ message is printed to the console. By right clicking and moving the button, we perform a drag & drop operation on the button widget.

class Button(QtGui.QPushButton):

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

We create a Button class which will derive from the QtGui.QPushButton. We also reimplement two methods of the QtGui.QPushButton: the mouseMoveEvent() and the mousePressEvent(). ThemouseMoveEvent() method is the place where the drag & drop operation begins.

if event.buttons() != QtCore.Qt.RightButton:
    return

Here we decide that we can perform drag & drop only with a right mouse button. The left mouse button is reserved for clicking on the button.

mimeData = QtCore.QMimeData()

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

The QDrag object is created. The class provides support for MIME-based drag and drop data transfer.

dropAction = drag.start(QtCore.Qt.MoveAction)

The start() method of the drag object starts the drag & drop operation.

def mousePressEvent(self, e):

    super(Button, self).mousePressEvent(e)

    if e.button() == QtCore.Qt.LeftButton:
        print ‘press‘

We print ‘press‘ to the console if we left click on the button with the mouse. Notice that we callmousePressEvent() method on the parent as well. Otherwise, we would not see the button being pushed.

position = e.pos()
self.button.move(position)

In the dropEvent() method we code what happens after we release the mouse button and finish the drop operation. We find out the current mouse pointer position and move the button accordingly.

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

We specify the type of the drop action. In our case it is a move action.

时间: 2024-10-05 19:20:01

Drag & drop a button widget的相关文章

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

Draggabilly – 轻松实现拖放功能(Drag & Drop)

Draggabilly 是一个很小的 JavaScript 库,专注于拖放功能.只需要简单的设置参数就可以在你的网站用添加拖放功能.兼容 IE8+ 浏览器,支持多点触摸.可以灵活绑定事件,支持 RequireJS 以及 Bower 安装. 您可能感兴趣的相关文章 创意无限!一组网页边栏过渡动画[附源码下载] 真是好东西!13种非常动感的页面加载动画效果 你见过吗?9款超炫的复选框(Checkbox)效果 超赞!基于 Bootstrap 的响应式的后台管理模板 太赞了!超炫的页面切换动画效果[附源

HTML 学习笔记 (drag & drop)

拖放(Drag & Drop)是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放.过去,我们用监听鼠标的Mousedown.Mouseove.Mouseup等事件来不停地获取鼠标的坐标来修改元素的位置,而现在html5原生的Drag &Drop事件(DnD),方便了许多,而且性能也有了提高. 如何使对象能够被拖动 为了使元素能够被拖动 需把要拖动元素的draggable 属性设置为true. <img src="../

Drag &amp; Drop and File Reader

参考 : http://www.html5rocks.com/zh/tutorials/file/dndfiles/ http://blog.csdn.net/rnzuozuo/article/details/25295899 http://www.tutorialspoint.com/html5/html5_drag_drop.htm 本篇只作为个人参考 FIle Reader method abort()  停止读 readAsText(file,"utf-8") , 第2参数是指

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

atitit.D&amp;D drag&amp;drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结

atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结 1. DND的操作流程 1 2. Html5 注解事件 document.dragover >>preventDefault 1 3. 代码(js) 1 4. C++ 实现拖曳 2 5. QT拖拽功能简介 - pcsuite的专栏 - 博客频道 - CSDN.NET.htm 2 1. DND的操作流程 Dragenter 事件::更改提示的颜色

HTML5魔法堂:全面理解Drag &amp; Drop API

一.前言    在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面目吧! 二.由于篇幅较长,特设目录一陀 三.HTML4下实现简单拖拽 四.HTML5下实现简单拖拽 五.如何启用DnD效果 六.draggable属性详解 七.DnD的生命周期 八.DnD中最重要的数据传递对象──DataTransfer对象 九.[object DataTransferItemLi

Drag Drop注册失败问题如何解决

Drag Drop注册失败的问题经常出现在开发项目的过程中,可能一开始运行的时候是好的,过了一段时间运行发现蹦出个这个问题. 现提供两种解决方案:1)在项目的program.cs中找到main函数,在main函数之前加上[STA Thread];2)如果你的线程是新开,则需要在你新开的线程启动之前加上这句代码:thread.SetApartmentState(ApartmentState.STA);

Android开发之Drag&amp;Drop框架实现拖放手势

Android3.0提供了drag/drop框架,利用此框架可以实现使用拖放手势将一个view拖放到当前布局中的另外一个view中.本文将介绍如何使用拖放框架. 一.实现拖放的步骤 首先,我们先了解一下拖放过程,从官方文档可以知道,整个拖放过程共分为4个步骤,具体如下: 1.  Started:启动拖放,主要是调用被拖放View的startDrag方法.此方法原型为: public final boolean startDrag(ClipData data, View.DragShadowBui