Drag and move item position

This commit is contained in:
杨万青 2015-06-25 23:05:54 +08:00
parent fb97508ea7
commit f91cc3ccdc
5 changed files with 104 additions and 29 deletions

View File

@ -6,11 +6,11 @@ Panel::Panel(QWidget *parent) : QWidget(parent)
leftLayout->resize(1024,50);
leftLayout->move(0,0);
AppItem * b1 = new AppItem("App",":/test/Resources/images/brasero.png");b1->resize(50,50);
AppItem * b2 = new AppItem("App",":/test/Resources/images/crossover.png");b2->resize(50,50);
AppItem * b3 = new AppItem("App",":/test/Resources/images/gcr-gnupg.png");b3->resize(50,50);
AppItem * b4 = new AppItem("App",":/test/Resources/images/display-im6.q16.png");b4->resize(50,50);
AppItem * b5 = new AppItem("App",":/test/Resources/images/eog.png");b5->resize(50,50);
AppItem * b1 = new AppItem("App",":/test/Resources/images/brasero.png");b1->resize(50,50);b1->setAcceptDrops(true);
AppItem * b2 = new AppItem("App",":/test/Resources/images/crossover.png");b2->resize(50,50);b2->setAcceptDrops(true);
AppItem * b3 = new AppItem("App",":/test/Resources/images/gcr-gnupg.png");b3->resize(50,50);b3->setAcceptDrops(true);
AppItem * b4 = new AppItem("App",":/test/Resources/images/display-im6.q16.png");b4->resize(50,50);b4->setAcceptDrops(true);
AppItem * b5 = new AppItem("App",":/test/Resources/images/eog.png");b5->resize(50,50);b5->setAcceptDrops(true);
leftLayout->addItem(b1);
leftLayout->addItem(b2);

View File

@ -3,9 +3,10 @@
AppItem::AppItem(QWidget *parent) :
QFrame(parent)
{
this->setParent(parent);
setParent(parent);
this->initBackground();
initBackground();
setAcceptDrops(true);
}
AppItem::AppItem(QString title, QWidget *parent):
@ -112,7 +113,7 @@ void AppItem::initBackground()
void AppItem::mousePressEvent(QMouseEvent * event)
{
// qWarning() << "mouse press...";
//qWarning() << "mouse press...";
emit mousePress(event->globalX(), event->globalY(),this);
}
@ -122,16 +123,32 @@ void AppItem::mouseReleaseEvent(QMouseEvent * event)
emit mouseRelease(event->globalX(), event->globalY(),this);
}
void AppItem::mouseMoveEvent(QMouseEvent * event)
{
emit mouseMove(event->globalX(), event->globalY(),this);
}
void AppItem::mouseDoubleClickEvent(QMouseEvent * event)
{
emit mouseDoubleClick(this);
}
void AppItem::mouseMoveEvent(QMouseEvent *event)
{
//this event will only execp onec then handle by Drag
emit dragStart(this);
Qt::MouseButtons btn = event->buttons();
if(btn == Qt::LeftButton)
{
QDrag* drag = new QDrag(this);
QMimeData* data = new QMimeData();
drag->setMimeData(data);
QPixmap pixmap(this->itemIconPath);
drag->setPixmap(pixmap);
drag->setHotSpot(QPoint(15,15));
drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::MoveAction);
}
}
void AppItem::enterEvent(QEvent *event)
{
emit mouseEntered(this);
@ -142,6 +159,35 @@ void AppItem::leaveEvent(QEvent *event)
emit mouseExited(this);
}
void AppItem::dragEnterEvent(QDragEnterEvent *event)
{
emit dragEntered(event,this);
// event->setDropAction(Qt::MoveAction);
// event->accept();
// if (event->mimeData()->hasFormat("application/x-dnditemdata")){
// if (event->source() == this){
// event->setDropAction(Qt::MoveAction);
// event->accept();
// }else{
// event->ignore();
// }
// }else{
// event->ignore();
// }
}
void AppItem::dragLeaveEvent(QDragLeaveEvent *event)
{
emit dragExited(event,this);
}
void AppItem::dropEvent(QDropEvent *event)
{
qWarning() << "Item get drop:" << event->pos();
emit drop(event,this);
}
AppItem::~AppItem()
{

View File

@ -7,11 +7,16 @@
#include <QMouseEvent>
#include <QDrag>
#include <QRectF>
#include <QDrag>
#include <QMimeData>
#include <QPixmap>
#include "dockconstants.h"
#include "appicon.h"
#include "appbackground.h"
#include "QDebug"
class QDragEnterEvent;
class QDropEvent;
class AppItem : public QFrame
{
Q_OBJECT
@ -37,17 +42,23 @@ public:
protected:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void mouseDoubleClickEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void enterEvent(QEvent * event);
void leaveEvent(QEvent * event);
void dragEnterEvent(QDragEnterEvent * event);
void dragLeaveEvent(QDragLeaveEvent * event);
void dropEvent(QDropEvent * event);
signals:
void dragStart(AppItem *item);
void dragEntered(QDragEnterEvent * event,AppItem *item);
void dragExited(QDragLeaveEvent * event,AppItem *item);
void drop(QDropEvent * event,AppItem *item);
void mouseEntered(AppItem *item);
void mouseExited(AppItem *item);
void mousePress(int x, int y, AppItem *item);
void mouseRelease(int x, int y, AppItem *item);
void mouseMove(int x, int y, AppItem *item);
void mouseDoubleClick( AppItem *item);
private:

View File

@ -3,6 +3,7 @@
DockLayout::DockLayout(QWidget *parent) :
QWidget(parent)
{
this->setAcceptDrops(true);
}
void DockLayout::setParent(QWidget *parent)
@ -22,10 +23,10 @@ void DockLayout::insertItem(AppItem *item, int index)
index = index > appCount ? appCount : (index < 0 ? 0 : index);
appList.insert(index,item);
connect(item, SIGNAL(mouseMove(int,int,AppItem*)),this,SLOT(slotItemDrag(int,int,AppItem*)));
connect(item,SIGNAL(mouseRelease(int,int,AppItem*)),this,SLOT(slotItemRelease(int,int,AppItem*)));
connect(item,SIGNAL(mouseEntered(AppItem*)),this,SLOT(slotItemEntered(AppItem*)));
connect(item, SIGNAL(mouseExited(AppItem*)),this,SLOT(slotItemExited(AppItem*)));
connect(item, SIGNAL(dragStart(AppItem*)),this,SLOT(slotItemDrag(AppItem*)));
connect(item,SIGNAL(dragEntered(QDragEnterEvent*,AppItem*)),this,SLOT(slotItemEntered(QDragEnterEvent*,AppItem*)));
connect(item,SIGNAL(dragExited(QDragLeaveEvent*,AppItem*)),this,SLOT(slotItemExited(QDragLeaveEvent*,AppItem*)));
relayout();
}
@ -110,10 +111,11 @@ void DockLayout::dragoutFromLayout(int index)
{
AppItem * tmpItem = appList.takeAt(index);
tmpItem->setVisible(false);
tmpAppMap.insert(tmpItem,index);
if (index == appList.count())//note,target hast been remove before
{
qWarning() << "out of range...";
// qWarning() << "end of list...";
return;//at the end of list
}
@ -182,7 +184,24 @@ int DockLayout::indexOf(int x, int y)
return 0;
}
void DockLayout::slotItemDrag(int x, int y, AppItem *item)
void DockLayout::dragEnterEvent(QDragEnterEvent *event)
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
void DockLayout::dropEvent(QDropEvent *event)
{
AppItem * tmpItem = tmpAppMap.firstKey();
tmpAppMap.remove(tmpItem);
tmpItem->setVisible(true);
if (indexOf(tmpItem) == -1)
{
insertItem(tmpItem,lastHoverIndex);
}
}
void DockLayout::slotItemDrag(AppItem *item)
{
// qWarning() << "Item draging..."<<x<<y<<item;
int tmpIndex = indexOf(item);
@ -199,17 +218,16 @@ void DockLayout::slotItemRelease(int x, int y, AppItem *item)
item->setVisible(true);
if (indexOf(item) == -1)
{
qWarning() << "---------" << lastHoverIndex;
insertItem(item,lastHoverIndex);
}
}
void DockLayout::slotItemEntered(AppItem *item)
void DockLayout::slotItemEntered(QDragEnterEvent * event,AppItem *item)
{
this->lastHoverIndex = indexOf(item);
}
void DockLayout::slotItemExited(AppItem *item)
void DockLayout::slotItemExited(QDragLeaveEvent *event,AppItem *item)
{
}

View File

@ -42,15 +42,15 @@ public:
int indexOf(AppItem * item);
int indexOf(int x,int y);
signals:
public slots:
protected:
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
private slots:
void slotItemDrag(int x,int y,AppItem *item);
void slotItemDrag(AppItem *item);
void slotItemRelease(int x, int y, AppItem *item);
void slotItemEntered(AppItem *item);
void slotItemExited(AppItem *item);
void slotItemEntered(QDragEnterEvent * event,AppItem *item);
void slotItemExited(QDragLeaveEvent *event,AppItem *item);
private:
void sortLeftToRight();