Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |

# Drag and Drop (Simple)

This provides a very simple example of TQt's drag and drop functionality.

For a more complete example see the Drag and Drop example.

Header file:

    /****************************************************************************
    ** $Id: qt/main.h   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include <ntqapplication.h>
    #include <ntqcursor.h>
    #include <ntqsplitter.h>
    #include <ntqlistbox.h>
    #include <ntqiconview.h>
    #include <ntqpixmap.h>

    class TQDragEnterEvent;
    class TQDragDropEvent;

    class DDListBox : public TQListBox
    {
        TQ_OBJECT
    public:
        DDListBox( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 );
        // Low-level drag and drop
        void dragEnterEvent( TQDragEnterEvent *evt );
        void dropEvent( TQDropEvent *evt );
        void mousePressEvent( TQMouseEvent *evt );
        void mouseMoveEvent( TQMouseEvent * );
    private:
        int dragging;
    };

    class DDIconViewItem : public TQIconViewItem
    {
    public:
        DDIconViewItem( TQIconView *parent, const TQString& text, const TQPixmap& icon ) :
            TQIconViewItem( parent, text, icon ) {}
        DDIconViewItem( TQIconView *parent, const TQString &text ) :
            TQIconViewItem( parent, text ) {}
        // High-level drag and drop
        bool acceptDrop( const TQMimeSource *mime ) const;
        void dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& );
    };

    class DDIconView : public TQIconView
    {
        TQ_OBJECT
    public:
        DDIconView( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 ) :
            TQIconView( parent, name, f ) {}
        // High-level drag and drop
        TQDragObject *dragObject();
    public slots:
        void slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& list );
    };

Implementation:

    /****************************************************************************
    ** $Id: qt/main.cpp   3.3.8   edited Jan 11 14:37 $
    **
    ** Copyright (C) 1992-2007 Trolltech ASA.  All rights reserved.
    **
    ** This file is part of an example program for TQt.  This example
    ** program may be used, distributed and modified without limitation.
    **
    *****************************************************************************/

    #include "main.h"

    const char* red_icon[]={
    "16 16 2 1",
    "r c red",
    ". c None",
    "................",
    "................",
    "..rrrrrrrrrrrr..",
    "..rrrrrrrrrrrr..",
    "..rrrrrrrrrrrr..",
    "..rrr......rrr..",
    "..rrr......rrr..",
    "..rrr......rrr..",
    "..rrr......rrr..",
    "..rrr......rrr..",
    "..rrr......rrr..",
    "..rrrrrrrrrrrr..",
    "..rrrrrrrrrrrr..",
    "..rrrrrrrrrrrr..",
    "................",
    "................"};

    const char* blue_icon[]={
    "16 16 2 1",
    "b c blue",
    ". c None",
    "................",
    "................",
    "..bbbbbbbbbbbb..",
    "..bbbbbbbbbbbb..",
    "..bbbbbbbbbbbb..",
    "..bbb......bbb..",
    "..bbb......bbb..",
    "..bbb......bbb..",
    "..bbb......bbb..",
    "..bbb......bbb..",
    "..bbb......bbb..",
    "..bbbbbbbbbbbb..",
    "..bbbbbbbbbbbb..",
    "..bbbbbbbbbbbb..",
    "................",
    "................"};

    const char* green_icon[]={
    "16 16 2 1",
    "g c green",
    ". c None",
    "................",
    "................",
    "..gggggggggggg..",
    "..gggggggggggg..",
    "..gggggggggggg..",
    "..ggg......ggg..",
    "..ggg......ggg..",
    "..ggg......ggg..",
    "..ggg......ggg..",
    "..ggg......ggg..",
    "..ggg......ggg..",
    "..gggggggggggg..",
    "..gggggggggggg..",
    "..gggggggggggg..",
    "................",
    "................"};

    // ListBox -- low level drag and drop

    DDListBox::DDListBox( TQWidget * parent, const char * name, WFlags f ) :
        TQListBox( parent, name, f )
    {
        setAcceptDrops( true );
        dragging = false;
    }

    void DDListBox::dragEnterEvent( TQDragEnterEvent *evt )
    {
        if ( TQTextDrag::canDecode( evt ) )
            evt->accept();
    }

    void DDListBox::dropEvent( TQDropEvent *evt )
    {
        TQString text;

        if ( TQTextDrag::decode( evt, text ) )
            insertItem( text );
    }

    void DDListBox::mousePressEvent( TQMouseEvent *evt )
    {
        TQListBox::mousePressEvent( evt );
        dragging = true;
    }

    void DDListBox::mouseMoveEvent( TQMouseEvent * )
    {
        if ( dragging ) {
            TQDragObject *d = new TQTextDrag( currentText(), this );
            d->dragCopy(); // do NOT delete d.
            dragging = false;
        }
    }

    // IconViewIcon -- high level drag and drop

    bool DDIconViewItem::acceptDrop( const TQMimeSource *mime ) const
    {
        if ( mime->provides( "text/plain" ) )
            return true;
        return false;
    }

    void DDIconViewItem::dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& )
    {
        TQString label;

        if ( TQTextDrag::decode( evt, label ) )
            setText( label );
    }

    // IconView -- high level drag and drop

    TQDragObject *DDIconView::dragObject()
    {
      return new TQTextDrag( currentItem()->text(), this );
    }

    void DDIconView::slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& )
    {
        TQString label;

        if ( TQTextDrag::decode( evt, label ) ) {
            DDIconViewItem *item = new DDIconViewItem( this, label );
            item->setRenameEnabled( true );
        }
    }

    int main( int argc, char *argv[] )
    {
        TQApplication app( argc, argv );

        // Create and show the widgets
        TQSplitter *split = new TQSplitter();
        DDIconView *iv   = new DDIconView( split );
        (void)             new DDListBox( split );
        app.setMainWidget( split );
        split->resize( 600, 400 );
        split->show();

        // Set up the connection so that we can drop items into the icon view
        TQObject::connect(
            iv, TQ_SIGNAL(dropped(TQDropEvent*, const TQValueList<TQIconDragItem>&)),
            iv, TQ_SLOT(slotNewItem(TQDropEvent*, const TQValueList<TQIconDragItem>&)));

        // Populate the TQIconView with icons
        DDIconViewItem *item;
        item = new DDIconViewItem( iv, "Red",   TQPixmap( red_icon ) );
        item->setRenameEnabled( true );
        item = new DDIconViewItem( iv, "Green", TQPixmap( green_icon ) );
        item->setRenameEnabled( true );
        item = new DDIconViewItem( iv, "Blue",  TQPixmap( blue_icon ) );
        item->setRenameEnabled( true );

        return app.exec();
    }

See also Examples.