Drag and Drop with PyQt4

Discussion in 'Python' started by Harshad, Aug 25, 2006.

  1. Harshad

    Harshad Guest

    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,300).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.UnicodeUTF8))

    ------------------------------------------- /zaraamain.py
    -------------------------------------------
    Harshad, Aug 25, 2006
    #1
    1. Advertising

  2. Harshad

    David Boddie Guest

    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-view-programming.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
    David Boddie, Aug 26, 2006
    #2
    1. Advertising

  3. Harshad

    Harshad Guest

    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.
    Harshad, Aug 26, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Oliver Klein
    Replies:
    0
    Views:
    685
    Oliver Klein
    Aug 24, 2003
  2. mr_cross
    Replies:
    11
    Views:
    612
    dorayme
    Oct 11, 2006
  3. backstreetboy

    Drag and Drop and Generate Graphic

    backstreetboy, Oct 22, 2007, in forum: Java
    Replies:
    0
    Views:
    297
    backstreetboy
    Oct 22, 2007
  4. wgw
    Replies:
    1
    Views:
    461
  5. Wayne Vucenic

    RubyDotNet and Drag and Drop

    Wayne Vucenic, Sep 28, 2003, in forum: Ruby
    Replies:
    3
    Views:
    158
    Wayne Vucenic
    Sep 28, 2003
Loading...

Share This Page