Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Drag and Drop with PyQt4

Reply
Thread Tools

Drag and Drop with PyQt4

 
 
Harshad
Guest
Posts: n/a
 
      08-25-2006
Hi,

I'm writing a program using Python 2.4 and PyQt4. The aim is to
implement drag and drop from filesystem and display a list of files
dragged on to the listWidget. This function will later become part of a
software for workflow management.

When I run the program, DragEnterEvent works as expected, but the
DropEvent does not seem to be working. I'm not an experienced Python
hacker, and am unable to trace out any problems with the source code.
Any and all help will be appreciated!

Cheers!
Harshad.

P.S.: The source code for the two files is given below:

------------------------------------------- zaraa.py
-------------------------------------------

from PyQt4 import QtCore, QtGui
from zaraamain import Ui_Dialog
import sys
from PyQt4 import *

class Zaraa(QtGui.QDialog, Ui_Dialog):
def __init__(self):
QtGui.QDialog.__init__(self)

# Set up the user interface from Designer.
self.setupUi(self)

# Enable Drag and Drop
self.listWidget.setAcceptDrops(True)

# Set up the handlers for the listWidget
self.listWidget.__class__.dragEnterEvent =
self.lwDragEnterEvent
self.listWidget.__class__.dropEvent = self.lwDropEvent

# Drag Enter Event handler
def lwDragEnterEvent(self, event):
print "DragEnter"
event.acceptProposedAction()

# ------------------------ BEGIN ------------------------
# The following event is not fired, or at least is not
# handled by this function - as is expected...

# Drag Drop Event Handler
def lwDropEvent(self, event):
print "DragDrop"

event.acceptProposedAction()

# we want to append only URLs to the list...
if event.mimeData().hasUrls() == True:
urllist = event.mimeData().urls()
for url in urllist:
self.listWidget.addItem(url.toLocalFile())
# ------------------------ END ------------------------

# Set up the application and execute it.
app = QtGui.QApplication(sys.argv)

window = Zaraa()
window.show()

sys.exit(app.exec_())

------------------------------------------- /zaraa.py
-------------------------------------------

------------------------------------------- zaraamain.py
-------------------------------------------
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'zaraamain.ui'
#
# Created: Sat Aug 26 00:00:10 2006
# by: PyQt4 UI code generator 4.0.1
#
# WARNING! All changes made in this file will be lost!

import sys
from PyQt4 import QtCore, QtGui

class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")

Dialog.resize(QtCore.QSize(QtCore.QRect(0,0,249,30 0).size()).expandedTo(Dialog.minimumSizeHint()))

self.vboxlayout = QtGui.QVBoxLayout(Dialog)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")

self.listWidget = QtGui.QListWidget(Dialog)
self.listWidget.setObjectName("listWidget")
self.vboxlayout.addWidget(self.listWidget)

self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)

def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate ("Dialog",
"Zaraa", None, QtGui.QApplication.UnicodeUTF)

------------------------------------------- /zaraamain.py
-------------------------------------------

 
Reply With Quote
 
 
 
 
David Boddie
Guest
Posts: n/a
 
      08-25-2006
Harshad wrote:

> When I run the program, DragEnterEvent works as expected, but the
> DropEvent does not seem to be working. I'm not an experienced Python
> hacker, and am unable to trace out any problems with the source code.
> Any and all help will be appreciated!


I'm making an educated guess from memory, but I think you need to
implement your own dragMoveEvent() method and accept the event there
as well. This is because the item view widgets typically like to handle
all aspects of drag and drop, and QListView (from which QListWidget is
derived) ignores drag move events by default.

So, if you want to change the behaviour in a fundamental way, you need
to handle many aspects of the process; in this case, you need to
provide your own dragEnterEvent(), dragMoveEvent() and dropEvent()
methods. These can be simple, as shown in the following example:

class ListWidget(QListWidget):
def __init__(self, parent = None):
QListWidget.__init__(self, parent)
self.setAcceptDrops(True)

def dragEnterEvent(self, event):
event.acceptProposedAction()

def dragMoveEvent(self, event):
event.acceptProposedAction()

def dropEvent(self, event):
print "Drop"
event.accept()

listWidget = ListWidget()
listWidget.show()

I tested this code with Python 2.4.2, Qt 4.1.4 and PyQt 4.1, and I
think you should be able to do the same in your code.

Two other points:

1. If you are prepared to try Qt's model/view classes, you can exert
more control over the way drag and drop is handled. They're not
quite as straightforward as the item-based classes that you're
already using, but you benefit from greater reusability of your
components and better control over the appearance and behaviour
of the view widgets.

This guide is for C++, but it translates fairly well into Python:

http://doc.trolltech.com/4.1/model-v...ogramming.html

2. You seem to prefer adding methods to specific instances rather than
subclassing and reimplementing methods in the base class. I hope
you don't mind me asking, but is that because it takes less code,
because you find it conceptually easier, or is there another reason
that I'm missing?

David

 
Reply With Quote
 
 
 
 
Harshad
Guest
Posts: n/a
 
      08-26-2006

David Boddie wrote:
>
> I tested this code with Python 2.4.2, Qt 4.1.4 and PyQt 4.1, and I
> think you should be able to do the same in your code.
>


First of all, thanks a lot for the very precise and quick help! Ot
works now.

> 1. If you are prepared to try Qt's model/view classes, you can exert
> more control over the way drag and drop is handled. They're not
> quite as straightforward as the item-based classes that you're
> already using, but you benefit from greater reusability of your
> components and better control over the appearance and behaviour
> of the view widgets.


I will certainly give it more thought and probably reimplement this
program with model/view classes. Thanks for the heads-up.

> 2. You seem to prefer adding methods to specific instances rather than
> subclassing and reimplementing methods in the base class. I hope
> you don't mind me asking, but is that because it takes less code,
> because you find it conceptually easier, or is there another reason
> that I'm missing?
>


I am pretty new to Python and more so with PyQt4 and am still to learn
a lot of things. I realized the issue with adding methods to specific
instances a bit after I emailed to the group. I am going to subclass
the widget classes in the program.

Again, thanks a lot.

Cheers!

Harshad.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
PyQt4.__file__ gives PyQt4/__init__.py as value wgw Python 1 08-15-2009 09:58 PM
Drag and Drop and Generate Graphic backstreetboy Java 0 10-22-2007 08:29 AM
Q:How to "drag and drop" jpg's into html and have the code write itself? mr_cross HTML 11 10-11-2006 10:27 PM
RubyDotNet and Drag and Drop Wayne Vucenic Ruby 3 09-28-2003 09:01 PM
Drag & Drop API: get source component in drop traget 'dragOver' Oliver Klein Java 0 08-24-2003 12:01 PM



Advertisments