赞
踩
Qt小例子学习61 - 拖动显示显示图像/图标/数据
block.h
#ifndef BLOCK_H
#define BLOCK_H
#include <QGraphicsPathItem>
class Block : public QGraphicsPathItem
{
public:
Block(QString color, QGraphicsItem *parent = nullptr);
};
#endif // BLOCK_H
block.cpp
#include "block.h"
#include <QPen>
Block::Block(QString color, QGraphicsItem *parent) : QGraphicsPathItem(parent)
{
QPainterPath p;
p.addRoundedRect(0, 0, 150, 50, 2, 2);
setPath(p);
setPen(QPen(Qt::black));
setBrush(QColor(color.toLower()));
setFlag(QGraphicsItem::ItemIsMovable);
setFlag(QGraphicsItem::ItemIsSelectable);
}
OptionList.h
#ifndef OPTIONLIST_H
#define OPTIONLIST_H
#include <QListWidget>
class OptionList : public QListWidget
{
public:
OptionList(QWidget *parent = nullptr);
protected:
void startDrag(Qt::DropActions supportedActions);
};
#endif // OPTIONLIST_H
optionlist.cpp
#include "optionlist.h" #include <QDrag> OptionList::OptionList(QWidget *parent) : QListWidget(parent) { setDragEnabled(true); setDropIndicatorShown(true); setSelectionMode(QAbstractItemView::SingleSelection); setDefaultDropAction(Qt::CopyAction); setViewMode(QListView::ListMode); for (const QString &color : {"Blue", "Red", "Green", "Yellow"}) { QListWidgetItem *blue = new QListWidgetItem; blue->setText(color); blue->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); addItem(blue); } } void OptionList::startDrag(Qt::DropActions supportedActions) { if (supportedActions & Qt::CopyAction) { QList<QListWidgetItem *> m_items = selectedItems(); if (m_items.isEmpty()) return; QMimeData *data = mimeData(m_items); QDrag *drag = new QDrag(this); QPixmap pixmap(":/images/MyIcon_icon.png"); drag->setPixmap(pixmap); drag->setMimeData(data); drag->setHotSpot(pixmap.rect().center()); drag->exec(Qt::CopyAction); } else QListWidget::startDrag(supportedActions); }
Scene.h
#ifndef SCENE_H #define SCENE_H #include <QGraphicsScene> class QGraphicsSceneDragDropEvent; class Scene : public QGraphicsScene { public: Scene(QObject *parent = nullptr); protected: void dragEnterEvent(QGraphicsSceneDragDropEvent *event); void dragMoveEvent(QGraphicsSceneDragDropEvent *event); void dropEvent(QGraphicsSceneDragDropEvent *event); }; #endif // SCENE_H
scene.cpp
#include "scene.h" #include "block.h" #include <QGraphicsSceneDragDropEvent> #include <QMimeData> Scene::Scene(QObject *parent) : QGraphicsScene(parent) { setBackgroundBrush(Qt::lightGray); } void Scene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) event->setAccepted(true); } void Scene::dragMoveEvent(QGraphicsSceneDragDropEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) event->setAccepted(true); } void Scene::dropEvent(QGraphicsSceneDragDropEvent *event) { QByteArray encoded = event->mimeData()->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encoded, QIODevice::ReadOnly); QStringList colors; while (!stream.atEnd()) { int row, col; QMap<int, QVariant> roleDataMap; stream >> row >> col >> roleDataMap; colors << roleDataMap[Qt::DisplayRole].toString(); } QPointF posView = event->scenePos(); for (const QString &color : colors) { Block *newBlock = new Block(color); newBlock->setPos(posView); addItem(newBlock); } }
main.cpp
#include "optionlist.h" #include "scene.h" #include <QApplication> #include <QGraphicsView> #include <QHBoxLayout> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QHBoxLayout lay(&w); OptionList list; QGraphicsView view; view.setScene(new Scene); lay.addWidget(&list); lay.addWidget(&view); w.show(); return a.exec(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。