C++/Qt/Drag Drop

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Drag and drop

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef DRAGWIDGET_H
  2. define DRAGWIDGET_H
  3. include <QByteArray>
  4. include <QFrame>
  5. include <QString>
  6. include <QStringList>

class QComboBox; class QFrame; class QLabel; class QTextBrowser; class DragWidget : public QFrame {

   Q_OBJECT

public:

   DragWidget(QWidget *parent);
   void setData(const QString &mimetype, const QByteArray &newData);

signals:

   void dragResult(const QString &actionText);
   void mimeTypes(const QStringList &types);

protected:

   void dragEnterEvent(QDragEnterEvent *event);
   void dropEvent(QDropEvent *event);
   void mouseMoveEvent(QMouseEvent *event);
   void mousePressEvent(QMouseEvent *event);

private:

   QByteArray data;
   QLabel *dragDropLabel;
   QPoint dragStartPosition;
   QString mimeType;

};

  1. endif



  1. include <QtGui>
  2. include "dragwidget.h"

DragWidget::DragWidget(QWidget *parent)

   : QFrame(parent)

{

   setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
   dragDropLabel = new QLabel("", this);
   dragDropLabel->setAlignment(Qt::AlignHCenter);
   QHBoxLayout *layout = new QHBoxLayout(this);
   layout->addStretch(0);
   layout->addWidget(dragDropLabel);
   layout->addStretch(0);
   setAcceptDrops(true);

} // Accept all actions, but deal with them separately later. void DragWidget::dragEnterEvent(QDragEnterEvent *event) {

   event->acceptProposedAction();

}

void DragWidget::dropEvent(QDropEvent *event) {

   if (event->source() == this && event->possibleActions() & Qt::MoveAction)
       return;
   if (event->proposedAction() == Qt::MoveAction) {
       event->acceptProposedAction();
       // Process the data from the event.
       emit dragResult(tr("The data was moved here."));
   } else if (event->proposedAction() == Qt::CopyAction) {
       event->acceptProposedAction();
       // Process the data from the event.
       emit dragResult(tr("The data was copied here."));
   } else {
       // Ignore the drop.
       return;
   }
   // End of quote
   emit mimeTypes(event->mimeData()->formats());
   setData(event->mimeData()->formats()[0],
           event->mimeData()->data(event->mimeData()->formats()[0]));

}

void DragWidget::mousePressEvent(QMouseEvent *event) {

   if (event->button() == Qt::LeftButton)
       dragStartPosition = event->pos();

}

void DragWidget::mouseMoveEvent(QMouseEvent *event) {

   if (!(event->buttons() & Qt::LeftButton))
       return;
   if ((event->pos() - dragStartPosition).manhattanLength()
        < QApplication::startDragDistance())
       return;
   QDrag *drag = new QDrag(this);
   QMimeData *mimeData = new QMimeData;
   mimeData->setData(mimeType, data);
   drag->setMimeData(mimeData);
   Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
   switch (dropAction) {
       case Qt::CopyAction:
           emit dragResult(tr("The text was copied."));
           break;
       case Qt::MoveAction:
           emit dragResult(tr("The text was moved."));
           break;
       default:
           emit dragResult(tr("Unknown action."));
           break;
   }

}

void DragWidget::setData(const QString &mimetype, const QByteArray &newData) {

   mimeType = mimetype;
   data = QByteArray(newData);
   dragDropLabel->setText(tr("%1 bytes").arg(data.size()));
   QStringList formats;
   formats << mimetype;
   emit mimeTypes(formats);

}



  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>
  4. include <QPixmap>
  5. include <QPoint>

class QComboBox; class QLabel; class QLineEdit; class QMouseEvent; class QTextEdit; class DragWidget; class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow(QWidget *parent = 0);

public slots:

   void setDragResult(const QString &actionText);
   void setMimeTypes(const QStringList &types);

private:

   QComboBox *mimeTypeCombo;
   DragWidget *dragWidget;

};

  1. endif


  1. include <QtGui>
  2. include "dragwidget.h"
  3. include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

   : QMainWindow(parent)

{

   QFrame *centralWidget = new QFrame(this);
   QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), centralWidget);
   mimeTypeCombo = new QComboBox(centralWidget);
   QLabel *dataLabel = new QLabel(tr("Amount of data (bytes):"), centralWidget);
   dragWidget = new DragWidget(centralWidget);
   connect(dragWidget, SIGNAL(mimeTypes(const QStringList &)),
           this, SLOT(setMimeTypes(const QStringList &)));
   connect(dragWidget, SIGNAL(dragResult(const QString &)),
           this, SLOT(setDragResult(const QString &)));
   QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
   mainLayout->addWidget(mimeTypeLabel);
   mainLayout->addWidget(mimeTypeCombo);
   mainLayout->addSpacing(32);
   mainLayout->addWidget(dataLabel);
   mainLayout->addWidget(dragWidget);
   statusBar();
   dragWidget->setData(QString("text/plain"), QByteArray("Hello world"));
   setCentralWidget(centralWidget);
   setWindowTitle(tr("Drag and Drop"));

} void MainWindow::setDragResult(const QString &actionText) {

   statusBar()->showMessage(actionText);

} void MainWindow::setMimeTypes(const QStringList &types) {

   mimeTypeCombo->clear();
   mimeTypeCombo->addItems(types);

}


  1. include <QtGui>
  2. include "mainwindow.h"

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

   QApplication app(argc, argv);
   MainWindow *window1 = new MainWindow;
   MainWindow *window2 = new MainWindow;
   window1->show();
   window2->show();
   return app.exec();

}


 </source>


Drag and drop text

<source lang="cpp">


/****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>
  4. include <QPixmap>
  5. include <QPoint>

class QLabel; class QLineEdit; class QMouseEvent; class QTextEdit; class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow(QWidget *parent = 0);

protected:

   void mousePressEvent(QMouseEvent *event);

private:

   QLabel *iconLabel;
   QLineEdit *nameEdit;
   QPixmap iconPixmap;
   QPoint dragStartPosition;
   QTextEdit *commentEdit;

};

  1. endif



  1. include <QtGui>
  2. include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

   : QMainWindow(parent)

{

   QFrame *centralFrame = new QFrame(this);
   QLabel *nameLabel = new QLabel(tr("Comment:"), centralFrame);
   commentEdit = new QTextEdit(centralFrame);
QLabel *dragLabel = new QLabel(tr("

Drag the icon to a filer " "window or the desktop background:

"),
                                     centralFrame);
   iconLabel = new QLabel(centralFrame);
   iconPixmap.load(":/images/file.png");
   iconLabel->setPixmap(iconPixmap);
   QGridLayout *grid = new QGridLayout(centralFrame);
   grid->addWidget(nameLabel, 0, 0);
   grid->addWidget(commentEdit, 1, 0, 1, 2);
   grid->addWidget(dragLabel, 2, 0);
   grid->addWidget(iconLabel, 2, 1);
   statusBar();
   setCentralWidget(centralFrame);
   setWindowTitle(tr("Dragging"));

}

void MainWindow::mousePressEvent(QMouseEvent *event) {

   if (event->button() == Qt::LeftButton
       && iconLabel->geometry().contains(event->pos())) {
      QDrag *drag = new QDrag(this);
       QMimeData *mimeData = new QMimeData;
       mimeData->setText(commentEdit->toPlainText());
       drag->setMimeData(mimeData);
       drag->setPixmap(iconPixmap);
       Qt::DropAction dropAction = drag->exec();
       QString actionText;
       switch (dropAction) {
           case Qt::CopyAction:
               actionText = tr("The text was copied.");
               break;
           case Qt::MoveAction:
               actionText = tr("The text was moved.");
               break;
           case Qt::LinkAction:
               actionText = tr("The text was linked.");
               break;
           case Qt::IgnoreAction:
               actionText = tr("The drag was ignored.");
               break;
           default:
               actionText = tr("Unknown action.");
               break;
       }
       statusBar()->showMessage(actionText);
   }

}


  1. include <QtGui>
  2. include "mainwindow.h"

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

   QApplication app(argc, argv);
   MainWindow *window = new MainWindow;
   window->show();
   return app.exec();

}


 </source>


Drag Drop List Model

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /

/****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of an example program for Qt.
    • EDITIONS: NOLIMITS
                                                                                                                                                        • /
  1. ifndef MODEL_H
  2. define MODEL_H
  3. include <QObject>
  4. include <QStringListModel>

class DragDropListModel : public QStringListModel {

   Q_OBJECT

public:

   DragDropListModel(const QStringList &strings, QObject *parent = 0);
   Qt::ItemFlags flags(const QModelIndex &index) const;
   bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                     int row, int column, const QModelIndex &parent);
   QMimeData *mimeData(const QModelIndexList &indexes) const;
   QStringList mimeTypes() const;
   Qt::DropActions supportedDropActions() const;

};

  1. endif


/*

 model.cpp
 A simple model that uses a QStringList as its data source.
  • /
  1. include <QtGui>
  2. include "model.h"

DragDropListModel::DragDropListModel(const QStringList &strings,

                                    QObject *parent)
   : QStringListModel(strings, parent)

{ }

bool DragDropListModel::dropMimeData(const QMimeData *data,

   Qt::DropAction action, int row, int column, const QModelIndex &parent)

{

   if (action == Qt::IgnoreAction)
       return true;
   if (!data->hasFormat("application/vnd.text.list"))
       return false;
   if (column > 0)
       return false;
   int beginRow;
   if (row != -1)
       beginRow = row;
   else if (parent.isValid())
       beginRow = parent.row();
   else
       beginRow = rowCount(QModelIndex());
   QByteArray encodedData = data->data("application/vnd.text.list");
   QDataStream stream(&encodedData, QIODevice::ReadOnly);
   QStringList newItems;
   int rows = 0;
   while (!stream.atEnd()) {
       QString text;
       stream >> text;
       newItems << text;
       ++rows;
   }
   insertRows(beginRow, rows, QModelIndex());
   foreach (QString text, newItems) {
       QModelIndex idx = index(beginRow, 0, QModelIndex());
       setData(idx, text);
       beginRow++;
   }
   return true;

} Qt::ItemFlags DragDropListModel::flags(const QModelIndex &index) const {

   Qt::ItemFlags defaultFlags = QStringListModel::flags(index);
   if (index.isValid())
       return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
   else
       return Qt::ItemIsDropEnabled | defaultFlags;

} QMimeData *DragDropListModel::mimeData(const QModelIndexList &indexes) const {

   QMimeData *mimeData = new QMimeData();
   QByteArray encodedData;
   QDataStream stream(&encodedData, QIODevice::WriteOnly);
   foreach (QModelIndex index, indexes) {
       if (index.isValid()) {
           QString text = data(index, Qt::DisplayRole).toString();
           stream << text;
       }
   }
   mimeData->setData("application/vnd.text.list", encodedData);
   return mimeData;

} QStringList DragDropListModel::mimeTypes() const {

   QStringList types;
   types << "application/vnd.text.list";
   return types;

} Qt::DropActions DragDropListModel::supportedDropActions() const {

   return Qt::CopyAction | Qt::MoveAction;

}



  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QMainWindow>

class QListView; class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow();

private:

   void setupListItems();
   QListView *listView;

};

  1. endif



  1. include <QtGui>
  2. include "mainwindow.h"
  3. include "model.h"

MainWindow::MainWindow() {

   QMenu *fileMenu = new QMenu(tr("&File"));
   QAction *quitAction = fileMenu->addAction(tr("E&xit"));
   quitAction->setShortcut(tr("Ctrl+Q"));
   menuBar()->addMenu(fileMenu);

// For convenient quoting: QListView *listView = new QListView(this); listView->setSelectionMode(QAbstractItemView::ExtendedSelection); listView->setDragEnabled(true); listView->setAcceptDrops(true); listView->setDropIndicatorShown(true);

   this->listView = listView;
   connect(quitAction, SIGNAL(triggered()), this, SLOT(close()));
   setupListItems();
   setCentralWidget(listView);
   setWindowTitle(tr("List View"));

} void MainWindow::setupListItems() {

   QStringList items;
   items << tr("Oak") << tr("Fir") << tr("Pine") << tr("Birch") << tr("Hazel")
         << tr("Redwood") << tr("Sycamore") << tr("Chestnut")
         << tr("Mahogany");
   DragDropListModel *model = new DragDropListModel(items, this);
   listView->setModel(model);

}


  1. include <QtGui>
  2. include "mainwindow.h"

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

   QApplication app(argc, argv);
   MainWindow *window = new MainWindow;
   window->show();
   return app.exec();

}


 </source>


Drop action

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QString>
  4. include <QStringList>
  5. include <QWidget>

class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget {

   Q_OBJECT

public:

   Window(QWidget *parent = 0);

protected:

   void dragEnterEvent(QDragEnterEvent *event);
   void dropEvent(QDropEvent *event);

private:

   QComboBox *mimeTypeCombo;
   QFrame *dropFrame;
   QTextBrowser *textBrowser;
   QString oldText;
   QStringList oldMimeTypes;

};

  1. endif


  1. include <QtGui>
  2. include "window.h"

Window::Window(QWidget *parent)

   : QWidget(parent)

{

   QLabel *textLabel = new QLabel(tr("Data:"), this);
   textBrowser = new QTextBrowser(this);
   QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this);
   mimeTypeCombo = new QComboBox(this);
   QVBoxLayout *layout = new QVBoxLayout(this);
   layout->addWidget(textLabel);
   layout->addWidget(textBrowser);
   layout->addWidget(mimeTypeLabel);
   layout->addWidget(mimeTypeCombo);

/*

   ...
   setAcceptDrops(true);
  • /
   setAcceptDrops(true);
   setWindowTitle(tr("Drop Actions"));

} void Window::dragEnterEvent(QDragEnterEvent *event) {

   if (event->mimeData()->hasFormat("text/plain"))
       event->acceptProposedAction();

} void Window::dropEvent(QDropEvent *event) {

   QMenu actionMenu(this);
   QAction *copyAction = 0;
   QAction *moveAction = 0;
   QAction *linkAction = 0;
   QAction *ignoreAction = 0;
   if (event->possibleActions() & Qt::CopyAction)
       copyAction = actionMenu.addAction(tr("Copy"));
   if (event->possibleActions() & Qt::MoveAction)
       moveAction = actionMenu.addAction(tr("Move"));
   if (event->possibleActions() & Qt::LinkAction)
       linkAction = actionMenu.addAction(tr("Link"));
   if (event->possibleActions() & Qt::IgnoreAction)
       ignoreAction = actionMenu.addAction(tr("Ignore"));
   QAction *result = actionMenu.exec(QCursor::pos());
   if (copyAction && result == copyAction)
       event->setDropAction(Qt::CopyAction);
   else if (moveAction && result == moveAction)
       event->setDropAction(Qt::MoveAction);
   else if (linkAction && result == linkAction)
       event->setDropAction(Qt::LinkAction);
   else {
       event->setDropAction(Qt::IgnoreAction);
       return;
   }
   textBrowser->setPlainText(event->mimeData()->text());
   mimeTypeCombo->clear();
   mimeTypeCombo->addItems(event->mimeData()->formats());

}


  1. include <QtGui>
  2. include "window.h"

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

   QApplication app(argc, argv);
   Window *window = new Window;
   window->show();
   return app.exec();

}


 </source>


Drop event

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QString>
  4. include <QStringList>
  5. include <QWidget>

class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget {

   Q_OBJECT

public:

   Window(QWidget *parent = 0);

protected:

   void dragEnterEvent(QDragEnterEvent *event);
   void dropEvent(QDropEvent *event);

private:

   QComboBox *mimeTypeCombo;
   QFrame *dropFrame;
   QTextBrowser *textBrowser;
   QString oldText;
   QStringList oldMimeTypes;

};

  1. endif


  1. include <QtGui>
  2. include "window.h"

Window::Window(QWidget *parent)

   : QWidget(parent)

{

   QLabel *textLabel = new QLabel(tr("Data:"), this);
   textBrowser = new QTextBrowser(this);
   QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this);
   mimeTypeCombo = new QComboBox(this);
   QVBoxLayout *layout = new QVBoxLayout(this);
   layout->addWidget(textLabel);
   layout->addWidget(textBrowser);
   layout->addWidget(mimeTypeLabel);
   layout->addWidget(mimeTypeCombo);
   setAcceptDrops(true);
   setWindowTitle(tr("Drop Events"));

}

void Window::dragEnterEvent(QDragEnterEvent *event) {

   if (event->mimeData()->hasFormat("text/plain"))
       event->acceptProposedAction();

}

void Window::dropEvent(QDropEvent *event) {

   textBrowser->setPlainText(event->mimeData()->text());
   mimeTypeCombo->clear();
   mimeTypeCombo->addItems(event->mimeData()->formats());
   event->acceptProposedAction();

}



  1. include <QtGui>
  2. include "window.h"

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

   QApplication app(argc, argv);
   Window *window = new Window;
   window->show();
   return app.exec();

}


 </source>


Drop rectangle

<source lang="cpp">

/****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QString>
  4. include <QStringList>
  5. include <QWidget>

class QComboBox; class QFrame; class QTextBrowser; class Window : public QWidget {

   Q_OBJECT

public:

   Window(QWidget *parent = 0);

protected:

   void dragMoveEvent(QDragMoveEvent *event);
   void dropEvent(QDropEvent *event);

private:

   QComboBox *mimeTypeCombo;
   QFrame *dropFrame;
   QTextBrowser *textBrowser;
   QString oldText;
   QStringList oldMimeTypes;

};

  1. endif




  1. include <QtGui>
  2. include "window.h"

Window::Window(QWidget *parent)

   : QWidget(parent)

{

   QLabel *textLabel = new QLabel(tr("Data:"), this);
   textBrowser = new QTextBrowser(this);
   QLabel *mimeTypeLabel = new QLabel(tr("MIME types:"), this);
   mimeTypeCombo = new QComboBox(this);
   dropFrame = new QFrame(this);
   dropFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
   QLabel *dropLabel = new QLabel(tr("Drop items here"), dropFrame);
   dropLabel->setAlignment(Qt::AlignHCenter);
   QVBoxLayout *dropFrameLayout = new QVBoxLayout(dropFrame);
   dropFrameLayout->addWidget(dropLabel);
   QHBoxLayout *dropLayout = new QHBoxLayout;
   dropLayout->addStretch(0);
   dropLayout->addWidget(dropFrame);
   dropLayout->addStretch(0);
   QVBoxLayout *mainLayout = new QVBoxLayout(this);
   mainLayout->addWidget(textLabel);
   mainLayout->addWidget(textBrowser);
   mainLayout->addWidget(mimeTypeLabel);
   mainLayout->addWidget(mimeTypeCombo);
   mainLayout->addSpacing(32);
   mainLayout->addLayout(dropLayout);
   setAcceptDrops(true);
   setWindowTitle(tr("Drop Rectangle"));

}

void Window::dragMoveEvent(QDragMoveEvent *event) {

   if (event->mimeData()->hasFormat("text/plain")
       && event->answerRect().intersects(dropFrame->geometry()))
       event->acceptProposedAction();

}

void Window::dropEvent(QDropEvent *event) {

   textBrowser->setPlainText(event->mimeData()->text());
   mimeTypeCombo->clear();
   mimeTypeCombo->addItems(event->mimeData()->formats());
   event->acceptProposedAction();

}


  1. include <QtGui>
  2. include "window.h"

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

   QApplication app(argc, argv);
   Window *window = new Window;
   window->show();
   return app.exec();

}


 </source>


Port for drop event

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QString>
  4. include <QStringList>
  5. include <QWidget>

class QComboBox; class QFrame; class QLabel; class MyWidget : public QWidget {

   Q_OBJECT

public:

   MyWidget(QWidget *parent = 0);

protected:

   void dragEnterEvent(QDragEnterEvent *event);
   void dropEvent(QDropEvent *event);
   void mousePressEvent(QMouseEvent *event);

private:

   QComboBox *mimeTypeCombo;
   QFrame *dropFrame;
   QLabel *dataLabel;
   QString oldText;
   QStringList oldMimeTypes;

};

  1. endif


  1. include <QtGui>
  2. include "window.h"

MyWidget::MyWidget(QWidget *parent)

   : QWidget(parent)

{

   QLabel *textLabel = new QLabel(tr("Data:"), this);
   dataLabel = new QLabel(this);
   dataLabel->setFixedSize(200, 200);
   QVBoxLayout *layout = new QVBoxLayout(this);
   layout->addWidget(textLabel);
   layout->addWidget(dataLabel);
   setAcceptDrops(true);
   setWindowTitle(tr("Drop Events"));

}

void MyWidget::dragEnterEvent(QDragEnterEvent *event) {

   if (event->mimeData()->hasText() || event->mimeData()->hasImage())
       event->acceptProposedAction();

}

void MyWidget::dropEvent(QDropEvent *event) {

   if (event->mimeData()->hasText())
       dataLabel->setText(event->mimeData()->text());
   else if (event->mimeData()->hasImage()) {
       QVariant imageData = event->mimeData()->imageData();
       dataLabel->setPixmap(qvariant_cast<QPixmap>(imageData));
   }
   event->acceptProposedAction();

}

void MyWidget::mousePressEvent(QMouseEvent *event) {

   QString text = dataLabel->text();
   QPixmap iconPixmap(32, 32);
   iconPixmap.fill(qRgba(255, 0, 0, 127));
   QImage image(100, 100, QImage::Format_RGB32);
   image.fill(qRgb(0, 0, 255));
   if (event->button() == Qt::LeftButton) {
       QDrag *drag = new QDrag(this);
       QMimeData *mimeData = new QMimeData;
       mimeData->setText(text);
       mimeData->setImageData(image);
       drag->setMimeData(mimeData);
       drag->setPixmap(iconPixmap);
       Qt::DropAction dropAction = drag->exec();
       // ...
       event->accept();
   }
   else if (event->button() == Qt::MidButton) {
       QDrag *drag = new QDrag(this);
       QMimeData *mimeData = new QMimeData;
       mimeData->setImageData(image);
       drag->setMimeData(mimeData);
       drag->setPixmap(iconPixmap);
       Qt::DropAction dropAction = drag->exec();
       // ...
       event->accept();
   }

}


  1. include <QtGui>
  2. include "window.h"

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

   QApplication app(argc, argv);
   MyWidget window;
   window.show();
   return app.exec();

}


 </source>