C++/Qt/Drag Drop
Содержание
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$
-
- /
- ifndef DRAGWIDGET_H
- define DRAGWIDGET_H
- include <QByteArray>
- include <QFrame>
- include <QString>
- 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;
};
- endif
- include <QtGui>
- 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);
}
- ifndef MAINWINDOW_H
- define MAINWINDOW_H
- include <QMainWindow>
- include <QPixmap>
- 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;
};
- endif
- include <QtGui>
- include "dragwidget.h"
- 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);
}
- include <QtGui>
- 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$
-
- /
- ifndef MAINWINDOW_H
- define MAINWINDOW_H
- include <QMainWindow>
- include <QPixmap>
- 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;
};
- endif
- include <QtGui>
- 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); }
}
- include <QtGui>
- 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
-
- /
- ifndef MODEL_H
- define MODEL_H
- include <QObject>
- 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;
};
- endif
/*
model.cpp A simple model that uses a QStringList as its data source.
- /
- include <QtGui>
- 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;
}
- ifndef WINDOW_H
- define WINDOW_H
- include <QMainWindow>
class QListView; class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow();
private:
void setupListItems(); QListView *listView;
};
- endif
- include <QtGui>
- include "mainwindow.h"
- 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);
}
- include <QtGui>
- 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$
-
- /
- ifndef WINDOW_H
- define WINDOW_H
- include <QString>
- include <QStringList>
- 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;
};
- endif
- include <QtGui>
- 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());
}
- include <QtGui>
- 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$
-
- /
- ifndef WINDOW_H
- define WINDOW_H
- include <QString>
- include <QStringList>
- 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;
};
- endif
- include <QtGui>
- 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();
}
- include <QtGui>
- 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$
-
- /
- ifndef WINDOW_H
- define WINDOW_H
- include <QString>
- include <QStringList>
- 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;
};
- endif
- include <QtGui>
- 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();
}
- include <QtGui>
- 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$
-
- /
- ifndef WINDOW_H
- define WINDOW_H
- include <QString>
- include <QStringList>
- 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;
};
- endif
- include <QtGui>
- 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(); }
}
- include <QtGui>
- include "window.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv); MyWidget window; window.show(); return app.exec();
}
</source>