部件之间图标拖拽(使用很直观,效果很漂亮)

又到周末了,尝试实现一个图标拖拽的小程序;主要实现的功能有:

1.两个部件的图标拖动转移

2.可以切换图标查看模式,有大图标和小图标模式两种

3.可以删除图标,添加也应该不难,所以就没实现。

4.可以框选多个图标

5.改变部件大小可以自动重新布局图标

这里初始化左边有十几个图标,右边的部件是空的。

主窗口

[cpp]  view plain  copy
 
  1. class MainWindow:public QMainWindow  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     MainWindow(QWidget *parent = NULL);  
  6.     ~MainWindow();  
  7.   
  8. private:  
  9.     Splitter    *m_pSplitter;  
  10.     MainWidget   *m_pLeftWidget;  
  11.     MainWidget   *m_pRightWidget;  
  12.     QScrollArea  *m_pSplitterArea;  
  13. };  
 
[cpp]  view plain  copy
 
  1. MainWindow::MainWindow( QWidget *parent /*= NULL*/ ):QMainWindow(parent)  
  2. {  
  3.     this->setWindowTitle("IconDemo");  
  4.     m_pSplitter = new Splitter(this);  
  5.     m_pLeftWidget = new MainWidget(this);  
  6.     m_pLeftWidget->init();  
  7.     m_pRightWidget = new MainWidget(this);  
  8.   
  9.     QSize size = m_pRightWidget->size();  
  10.     m_pSplitterArea = new QScrollArea(this);  
  11.     m_pSplitterArea->setWidget(m_pSplitter);  
  12.     m_pSplitter->addWidget(m_pLeftWidget);  
  13.     m_pSplitter->addWidget(m_pRightWidget);  
  14.     m_pSplitter->setMinimumSize(QSize(700,700));  
  15.     m_pSplitterArea->setMinimumSize(QSize(700,600));  
  16.   
  17.     m_pSplitter->setCollapsible(0,false);  
  18.     m_pSplitter->setCollapsible(1,false);  
  19.   
  20.     this->setStyleSheet(" QFrame{background-image: url(:/DragIcon/Resources/51.jpg) }");  
  21.   
  22.     this->setFixedSize(QSize(700,550));  
  23.     connect(m_pLeftWidget,SIGNAL(heightChangeSignal(int)),m_pSplitter,SLOT(heightChangeSlot(int  )));  
  24.     connect(m_pRightWidget,SIGNAL(heightChangeSignal(int)),m_pSplitter,SLOT(heightChangeSlot(int )));  
  25.   
  26. }  
  27.   
  28. MainWindow::~MainWindow()  
  29. {  
  30.   
  31. }  

分割器

自定义分割器主要是为了在调节的时候可以改变其高度
[cpp]  view plain  copy
 
  1. class Splitter:public QSplitter  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     Splitter(QWidget *parent = NULL);  
  6.     ~Splitter();  
  7. protected slots:  
  8.     void heightChangeSlot(int height);  
  9. private:  
  10. };  

[cpp]  view plain  copy
 
  1. Splitter::Splitter( QWidget *parent /*= NULL*/ ):QSplitter(parent)  
  2. {  
  3.   
  4. }  
  5.   
  6. Splitter::~Splitter()  
  7. {  
  8.   
  9. }  
  10.   
  11. void Splitter::heightChangeSlot( int height )  
  12. {  
  13.     this->setMinimumHeight(height);  
  14. }  
 

控制器和数据结构

Controller主要用于控制数据结构,添加和删除图标等。这里还自定义了一个ItemMimeData用于拖拽图标
[cpp]  view plain  copy
 
  1. enum {BigIcon_Mode = 0, SmallIcon_Mode};  
  2. struct IconItemData  
  3. {  
  4.     QImage  image;  
  5.     QString name;  
  6.     int mode ;  
  7.     IconItemData()  
  8.     {  
  9.         mode = SmallIcon_Mode;  
  10.     }  
  11. };  
  12.   
  13. class Controller:public QObject  
  14. {  
  15.     Q_OBJECT  
  16. public:  
  17.     Controller(QObject *parent = NULL);  
  18.     ~Controller();  
  19.     void init();  
  20.     void addItem(IconItemData* pItem);  
  21.     void deleteItem(int index);  
  22.     void deleteItem(IconItemData* pItem);  
  23.     void changeIconMode(int mode);  
  24.     size_t getSize()  
  25.     {  
  26.         return m_IconDataVec.size();  
  27.     }  
  28.   
  29.     IconItemData* getItem(int index);  
  30.   
  31. protected:  
  32.       
  33. private:  
  34.     vector<IconItemData*>  m_IconDataVec;  
  35. };  
  36.   
  37.   
  38. class ItemMimeData:public QMimeData  
  39. {  
  40.     Q_OBJECT  
  41. public:  
  42.     ItemMimeData():QMimeData()  
  43.     {  
  44.         m_pDragItemList = NULL;  
  45.     }  
  46.   
  47.     ~ItemMimeData()  
  48.     {  
  49.         if (m_pDragItemList)  
  50.         {  
  51.             delete m_pDragItemList;  
  52.         }  
  53.     }  
  54.   
  55.     void SetDragDatas(QString mimeType , QList<IconItemData*> *pItemList)  
  56.     {  
  57.         m_format<<mimeType;  
  58.         m_pDragItemList = pItemList;  
  59.     }  
  60.   
  61.     QStringList formats() const  
  62.     {  
  63.         return m_format;  
  64.     }  
  65.   
  66.     const QList<IconItemData*>* DragItemData() const  
  67.     {  
  68.         return m_pDragItemList;  
  69.     }  
  70.   
  71.   
  72.   
  73. protected:  
  74.   
  75.     QVariant retrieveData(const QString &mimetype, QVariant::Type preferredType) const  
  76.     {  
  77.         if (mimetype == "ItemMimeData")  
  78.         {  
  79.             return m_pDragItemList;  
  80.         }  
  81.   
  82.         else  
  83.         {  
  84.              return QMimeData::retrieveData(mimetype, preferredType);    
  85.         }  
  86.     }  
  87. private:  
  88.     QStringList              m_format;  
  89.     const QList<IconItemData*> *m_pDragItemList;  
  90. };  

[cpp]  view plain  copy
 
  1. void Controller::addItem( IconItemData* pItem )  
  2. {  
  3.     if (pItem)  
  4.     {  
  5.         m_IconDataVec.push_back(pItem);  
  6.     }  
  7. }  
  8.   
  9. void Controller::deleteItem( int index )  
  10. {  
  11.     if ((index > 0) && (index < m_IconDataVec.size()))  
  12.     {  
  13.         vector<IconItemData*>::iterator it = m_IconDataVec.begin();  
  14.         it = it + index;  
  15.         m_IconDataVec.erase(it);  
  16.     }  
  17. }  
  18.   
  19. void Controller::deleteItem( IconItemData* pItem )  
  20. {  
  21.     if (pItem)  
  22.     {  
  23.         vector<IconItemData*>::iterator it = m_IconDataVec.begin();  
  24.         for (it; it != m_IconDataVec.end(); ++it)  
  25.         {  
  26.             if (pItem == *it)  
  27.             {  
  28.                 m_IconDataVec.erase(it);  
  29.                 break;  
  30.             }  
  31.         }  
  32.     }  
  33. }  
  34.   
  35. IconItemData* Controller::getItem( int index )  
  36. {  
  37.     if ((index >= 0) && (index < m_IconDataVec.size()))  
  38.     {  
  39.         return m_IconDataVec[index];  
  40.     }  
  41. }  
  42.   
  43. void Controller::init()  
  44. {  
  45.     for (int i = 0; i < 20; ++i)  
  46.     {  
  47.         IconItemData *pItem = new IconItemData;  
  48.         pItem->name = QString::number(i);  
  49.         QString iconPath = QString(":/DragIcon/Resources/%1.jpg").arg(i);  
  50.         QFile Iconfile(iconPath);  
  51.         if (Iconfile.exists())  
  52.         {  
  53.             pItem->image = QImage(iconPath);  
  54.             m_IconDataVec.push_back(pItem);  
  55.         }  
  56.         else  
  57.         {  
  58.             delete pItem;  
  59.         }  
  60.     }  
  61. }  
  62.   
  63. Controller::Controller( QObject *parent /*= NULL*/ ):QObject(parent)  
  64. {  
  65.     //init();  
  66. }  
  67.   
  68. Controller::~Controller()  
  69. {  
  70.   
  71. }  
  72.   
  73. void Controller::changeIconMode( int mode )  
  74. {  
  75.     for (int i = 0; i < m_IconDataVec.size(); ++i)  
  76.     {  
  77.         m_IconDataVec[i]->mode = mode;  
  78.     }  
  79. }  

图标部件

IconItemWidget主要由一个label显示图标,lineEdit来显示名称
[cpp]  view plain  copy
 
  1. class ItemNameLineEdit:public QLineEdit  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     ItemNameLineEdit(QWidget *parent = NULL);  
  6.     ~ItemNameLineEdit();  
  7. protected:  
  8.     void mouseDoubleClickEvent ( QMouseEvent * event );  
  9.     private slots:  
  10.         void finishEditSlot();  
  11. };  
  12.   
  13. class IconItemWidget:public QWidget  
  14. {  
  15.     Q_OBJECT  
  16. public:  
  17.     IconItemWidget(IconItemData *pData,QWidget *parent = NULL);  
  18.     ~IconItemWidget();  
  19.   
  20.     void unSelectedItem()  
  21.     {  
  22.         m_selected = false;  
  23.     }  
  24.     void SelectItem()  
  25.     {  
  26.         m_selected = true;  
  27.     }  
  28.   
  29.     IconItemData *getData()  
  30.     {  
  31.         return m_pItemData;  
  32.     }  
  33. protected:  
  34.     void resizeEvent ( QResizeEvent * event ) ;  
  35.     void paintEvent ( QPaintEvent * event ) ;  
  36. private:  
  37.     QLabel              *m_pImage;  
  38.     ItemNameLineEdit    *m_pNameLEdit;  
  39.     IconItemData        *m_pItemData;  
  40.     bool                 m_selected;  
  41.     QPoint               m_mousePressPos;  
  42. };  

[cpp]  view plain  copy
 
  1. IconItemWidget::IconItemWidget( IconItemData *pData,QWidget *parent /*= NULL*/ ):QWidget(parent),m_pItemData(pData)  
  2. {  
  3.     m_selected = false;  
  4.     m_pImage = new QLabel(this);  
  5.     m_pNameLEdit = new ItemNameLineEdit(this);  
  6.     m_pNameLEdit->setAlignment(Qt::AlignCenter);  
  7.     QSize imageSize;  
  8.     QPixmap pixmap ;  
  9.     if (m_pItemData->mode == BigIcon_Mode)  
  10.     {  
  11.         pixmap = QPixmap::fromImage(m_pItemData->image).scaled(QSize(100,100),Qt::KeepAspectRatio);  
  12.          imageSize = pixmap.size();  
  13.           
  14.         m_pImage->setPixmap(pixmap);  
  15.         m_pNameLEdit->setText(m_pItemData->name);  
  16.         const int spacing = 5;  
  17.         int nameheight = 15;  
  18.         m_pImage->setGeometry(spacing,spacing,imageSize.width(),imageSize.height());  
  19.         m_pNameLEdit->setGeometry(spacing,spacing + imageSize.height(),imageSize.width(),nameheight);  
  20.         this->setFixedSize(QSize(imageSize.width() + 10,imageSize.height() + 25));  
  21.     }   
  22.     else if (m_pItemData->mode == SmallIcon_Mode)  
  23.     {  
  24.         pixmap = QPixmap::fromImage(m_pItemData->image).scaled(QSize(80,80),Qt::KeepAspectRatio);  
  25.          imageSize = pixmap.size();  
  26.         m_pImage->setPixmap(pixmap);  
  27.         m_pNameLEdit->setText(m_pItemData->name);  
  28.         const int spacing = 5;  
  29.         int nameheight = 15;  
  30.         m_pImage->setGeometry(spacing,spacing,imageSize.width(),imageSize.height());  
  31.         m_pNameLEdit->setGeometry(spacing,spacing + imageSize.height(),imageSize.width(),nameheight);  
  32.         this->setFixedSize(QSize(imageSize.width() + 10,imageSize.height() + 25));  
  33.     }  
  34.       
  35.       
  36. }  
  37.   
  38. IconItemWidget::~IconItemWidget()  
  39. {  
  40.   
  41. }  
  42.   
  43. void IconItemWidget::resizeEvent( QResizeEvent * event )  
  44. {  
  45.     QWidget::resizeEvent(event);  
  46. }  
  47.   
  48. void IconItemWidget::paintEvent( QPaintEvent * event )  
  49. {  
  50.     if (m_selected)  
  51.     {  
  52.         //添加选中样式边框  
  53.         this->setStyleSheet("QLabel{border-width: 2px;border-style: solid;border-color: blue;}");  
  54.     }  
  55.     else  
  56.     {  
  57.         //取消选中样式  
  58.         this->setStyleSheet("");  
  59.     }  
  60.     QWidget::paintEvent(event);  
  61. }  
  62.   
  63. void ItemNameLineEdit::mouseDoubleClickEvent( QMouseEvent * event )  
  64. {  
  65.     this->setReadOnly(false);  
  66. }  
  67.   
  68. ItemNameLineEdit::ItemNameLineEdit( QWidget *parent /*= NULL*/ ):QLineEdit(parent)  
  69. {  
  70.     this->setContextMenuPolicy(Qt::NoContextMenu);   //禁用默认右键菜单  
  71.     this->setReadOnly(true);  
  72.     connect(this ,SIGNAL(editingFinished ()),this,SLOT(finishEditSlot()));  
  73. }  
  74.   
  75. ItemNameLineEdit::~ItemNameLineEdit()  
  76. {  
  77.   
  78. }  
  79.   
  80. void ItemNameLineEdit::finishEditSlot()  
  81. {  
  82.     this->setReadOnly(true);  
  83. }  

布局部件

[cpp]  view plain  copy
 
  1. class MainWidget:public QWidget  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     MainWidget(QWidget *parent = NULL);  
  6.     ~MainWidget();  
  7.       
  8.     void init();  
  9.   
  10. private slots:  
  11.     void bigModeSlot();  
  12.     void smallModeSlot();  
  13.     void reLayoutIconSlot();  
  14.     void deleteItemSlot();  
  15.   
  16. protected:  
  17.     void mousePressEvent ( QMouseEvent * event );  
  18.     void mouseMoveEvent ( QMouseEvent * event );  
  19.     void mouseReleaseEvent(QMouseEvent *event);  
  20.     void dragEnterEvent ( QDragEnterEvent * event );  
  21.     void dragLeaveEvent ( QDragLeaveEvent * event );  
  22.     void dragMoveEvent ( QDragMoveEvent * event ) ;  
  23.     void dropEvent(QDropEvent *event);  
  24.   
  25.     void resizeEvent ( QResizeEvent * event );  
  26.     void paintEvent ( QPaintEvent * event );  
  27.     QRect GetItemRect( int index);  
  28.     void clear();  
  29.     void performDrag();  
  30.     void SelectItem();  
  31.     bool HitTest(QMouseEvent * event);  
  32.     bool isInVector(IconItemWidget* pItem);  
  33. signals:  
  34.     void heightChangeSignal(int height);  
  35. private:  
  36.     int                         iconMode;  
  37.     Controller                 *m_pController;  
  38.     vector<IconItemWidget*>     m_ItemVec;  
  39.     QPushButton             *m_pAddButton;  
  40.     QPoint               m_mousePressPos;  
  41.     vector<IconItemWidget*>  m_selectItemVec;  
  42.     QPoint               m_mousePos;                  
  43. };  

[cpp]  view plain  copy
 
  1. MainWidget::MainWidget( QWidget *parent /*= NULL*/ ):QWidget(parent),iconMode(SmallIcon_Mode)  
  2. {  
  3.     this->setAcceptDrops(true);  
  4.     m_pController = new Controller(this);  
  5.     //init();  
  6.     this->setMinimumWidth(100);  
  7. }  
  8.   
  9. MainWidget::~MainWidget()  
  10. {  
  11.   
  12. }  
  13.   
  14. void MainWidget::init()  
  15. {  
  16.     m_pController->init();  
  17.     for (int i = 0; i < m_pController->getSize(); ++i)  
  18.     {  
  19.         IconItemWidget *pItemWidget = new IconItemWidget(m_pController->getItem(i),this);  
  20.         m_ItemVec.push_back(pItemWidget);  
  21.     }  
  22. }  
  23. //获取每个图标应该布局的位置  
  24.  QRect MainWidget::GetItemRect( int index )  
  25. {  
  26.     if (index < 0 || index > m_ItemVec.size())  
  27.     {  
  28.         return QRect();  
  29.     }  
  30.     const int spacing = 5;  
  31.     int width = this->width();  
  32.     int height = this->height();  
  33.   
  34.     int itemWidth = m_ItemVec[index]->width();  
  35.     int itemHeight = m_ItemVec[index]->height();  
  36.     int colCount = width / (itemWidth + spacing );  
  37.     int rowCount = height / (itemHeight + spacing);  
  38.     int row = index / colCount;  
  39.     int col = index % colCount;  
  40.     int xPos = col * (itemWidth + spacing );  
  41.     int yPos = row * (itemHeight + spacing);  
  42.     return QRect(xPos,yPos,itemWidth,itemHeight);  
  43. }  
  44.   
  45.  void MainWidget::resizeEvent( QResizeEvent * event )  
  46.  {  
  47.      //改变大小了要重新布局  
  48.      for (int i = 0; i < m_ItemVec.size(); ++i)  
  49.      {  
  50.          QRect rect = GetItemRect(i);  
  51.          if (i == m_ItemVec.size() - 1)  
  52.          {  
  53.              this->setMinimumHeight(rect.y() + 20);  
  54.              emit heightChangeSignal(this->height());  
  55.          }  
  56.           
  57.          m_ItemVec[i]->setGeometry(rect);  
  58.      }  
  59.      QWidget::resizeEvent(event);  
  60.  }  
  61.   
  62.  void MainWidget::paintEvent( QPaintEvent * event )  
  63.  {  
  64.      if (m_mousePos.x() == 0 && m_mousePos.y() == 0)  
  65.      {  
  66.          return;  
  67.      }  
  68.      //画红色选框  
  69.      QRect rect(m_mousePressPos,m_mousePos);  
  70.      QPainter painter(this);  
  71.      painter.setPen(Qt::red);  
  72.      painter.drawRect(rect);  
  73.      update();  
  74.      QWidget::paintEvent(event);  
  75.  }  
  76.   
  77.  void MainWidget::mousePressEvent( QMouseEvent * event )  
  78.  {  
  79.      m_mousePressPos = event->pos();  
  80.      //点击空白处则情况选中,  
  81.      //如果m_selectItemVec大小为1,则也要清空下面再另外选中  
  82.      //右键单击也要清空m_selectItemVec  
  83.      if (!HitTest(event) || (m_selectItemVec.size() == 1) ||Qt::RightButton == event->button())     
  84.      {  
  85.         for (int i = 0; i < m_selectItemVec.size(); ++i)  
  86.         {  
  87.             m_selectItemVec[i]->unSelectedItem();  
  88.         }  
  89.         m_selectItemVec.clear();  
  90.     }  
  91.       
  92.      for (int i = 0; i < m_ItemVec.size(); ++i)  
  93.      {  
  94.          QRect rect = GetItemRect(i);  
  95.          if (rect.contains(event->pos()) && (!isInVector(m_ItemVec[i])))  //图标尚未被选中则添加到m_selectItemVec  
  96.          {  
  97.              m_selectItemVec.push_back(m_ItemVec[i]);  
  98.              m_ItemVec[i]->SelectItem();  
  99.          }  
  100.      }  
  101.   
  102.      QWidget *pWidget = QApplication::focusWidget();   //如果正在编辑名称,点击别的地方可以结束编辑  
  103.      if (pWidget)  
  104.      {  
  105.          pWidget->clearFocus();  
  106.      }  
  107.   
  108.      //右键菜单  
  109.      if (Qt::RightButton == event->button())  
  110.      {  
  111.          QMenu *pMenu = new QMenu(this);  
  112.          QAction *pBigModeAct = new QAction(tr("大图标"),pMenu);  
  113.          QAction *pSmallModeAct = new QAction(tr("小图标"),pMenu);  
  114.          QAction *pDeleteAct = new QAction(tr("删除"),pMenu);  
  115.           if (m_selectItemVec.size() > 0)   //有选中的则弹出删除菜单  
  116.           {  
  117.                pMenu->addAction(pDeleteAct);  
  118.               connect(pDeleteAct,SIGNAL(triggered()),this,SLOT(deleteItemSlot()));  
  119.           }  
  120.           else  
  121.           {  
  122.               //点击空白处则可切换图标模式  
  123.               pMenu->addAction(pBigModeAct);  
  124.               pMenu->addAction(pSmallModeAct);  
  125.               connect(pBigModeAct,SIGNAL(triggered()),this,SLOT(bigModeSlot()));  
  126.               connect(pSmallModeAct,SIGNAL(triggered()),this,SLOT(smallModeSlot()));  
  127.           }  
  128.            
  129.          pMenu->exec(event->globalPos());  
  130.          delete pMenu;  
  131.      }  
  132.      QWidget::mousePressEvent(event);  
  133.  }  
  134.   
  135.  //大图标模式  
  136.  void MainWidget::bigModeSlot()  
  137.  {  
  138.      m_pController->changeIconMode(BigIcon_Mode);  
  139.      reLayoutIconSlot();  
  140.       this->update();  
  141.  }  
  142.  //小图标模式  
  143.  void MainWidget::smallModeSlot()  
  144.  {  
  145.       m_pController->changeIconMode(SmallIcon_Mode);  
  146.        reLayoutIconSlot();  
  147.        this->update();  
  148.  }  
  149.   
  150.  void MainWidget::reLayoutIconSlot()  
  151.  {  
  152.      clear();    //先清除  
  153.      for (int i = 0; i < m_pController->getSize(); ++i)  
  154.      {  
  155.          //重新生成图标  
  156.          IconItemWidget *pItemWidget = new IconItemWidget(m_pController->getItem(i),this);  
  157.          m_ItemVec.push_back(pItemWidget);  
  158.      }  
  159.      for (int i = 0; i < m_ItemVec.size(); ++i)  
  160.      {  
  161.          QRect rect = GetItemRect(i);  
  162.          m_ItemVec[i]->setGeometry(rect);  
  163.          m_ItemVec[i]->show();             //重新生成,布局图标必须show才能显示  
  164.      }  
  165.      this->repaint();  
  166.  }  
  167.   
  168.  void MainWidget::clear()  
  169.  {  
  170.      qDeleteAll(m_ItemVec);  
  171.      m_ItemVec.clear();  
  172.  }  
  173.   
  174.  void MainWidget::mouseMoveEvent( QMouseEvent * event )  
  175.  {  
  176.      if (event->buttons() & Qt::LeftButton && (m_selectItemVec.size() > 0))  
  177.      {  
  178.          if (( m_mousePressPos - event->pos()).manhattanLength() > QApplication::startDragDistance())  
  179.          {  
  180.              performDrag();  
  181.          }  
  182.      }  
  183.      else  
  184.      {  
  185.          m_mousePos = event->pos();  
  186.      }  
  187.      QWidget::mouseMoveEvent(event);  
  188.  }  
  189.   
  190.  void MainWidget::mouseReleaseEvent( QMouseEvent *event )  
  191.  {  
  192.      if (m_mousePos.x() == 0 && m_mousePos.y() == 0)  
  193.      {  
  194.          return;  
  195.      }  
  196.      else   
  197.      {  
  198.          //release鼠标再进行选择  
  199.          SelectItem();  
  200.      }  
  201.      m_mousePos = QPoint();  
  202.      QWidget::mouseReleaseEvent(event);  
  203.  }  
  204.   
  205.  void MainWidget::dragEnterEvent( QDragEnterEvent * event )  
  206.  {  
  207.      const ItemMimeData *pMimeData = (const ItemMimeData*)event->mimeData();  
  208.      const QList<IconItemData*>* plist = pMimeData->DragItemData();  
  209.      if (plist)  
  210.      {  
  211.          event->accept();  
  212.      }  
  213.  }  
  214.   
  215.  void MainWidget::dragLeaveEvent( QDragLeaveEvent * event )  
  216.  {  
  217.   
  218.  }  
  219.   
  220.  void MainWidget::dragMoveEvent( QDragMoveEvent * event )  
  221.  {  
  222.      event->accept();  
  223.  }  
  224.   
  225.  void MainWidget::performDrag()  
  226.  {  
  227.      QDrag  *pDrag = new QDrag(this);  
  228.      ItemMimeData *pData = new ItemMimeData;  
  229.       QList<IconItemData*> *plist = new QList<IconItemData*>;  
  230.      for (int i = 0; i < m_selectItemVec.size(); ++i)  
  231.      {  
  232.          plist->append(m_selectItemVec[i]->getData());  
  233.      }  
  234.      pData->SetDragDatas("ItemMimeData",plist);  
  235.      pDrag->setMimeData(pData);  
  236.   
  237.      QPixmap pixmap = QPixmap::fromImage(m_selectItemVec[0]->getData()->image).scaled(50,50,Qt::KeepAspectRatio);  
  238.      pDrag->setPixmap(pixmap);  
  239.      pDrag->exec(Qt::CopyAction);  
  240.      //delete m_selectItemVec[0];  
  241.  }  
  242.   
  243.  void MainWidget::dropEvent( QDropEvent *event )  
  244.  {  
  245.      const ItemMimeData *pMimeData = (const ItemMimeData*)event->mimeData();  
  246.      const QList<IconItemData*>* plist = pMimeData->DragItemData();  
  247.      if (plist)  
  248.      {  
  249.          for (int i = 0; i < plist->size(); ++i)  
  250.          {  
  251.              m_pController->addItem(plist->at(i));  
  252.          }  
  253.          reLayoutIconSlot();  
  254.          event->accept();  
  255.      }  
  256.   
  257.  }  
  258.   
  259.  void MainWidget::deleteItemSlot()  
  260.  {  
  261.      //删除再重新布局  
  262.      for (int i = 0; i < m_selectItemVec.size(); ++i)  
  263.      {  
  264.          m_pController->deleteItem(m_selectItemVec[i]->getData());  
  265.      }  
  266.      reLayoutIconSlot();  
  267.  }  
  268.   
  269.   
  270.  //框选多个图标  
  271.  void MainWidget::SelectItem()  
  272.  {  
  273.       QRect rect(m_mousePressPos,m_mousePos);  
  274.       for (int i = 0; i < m_ItemVec.size(); ++i)  
  275.       {  
  276.           QPoint centerPos = GetItemRect(i).center();  
  277.           if (rect.contains(centerPos))  
  278.           {  
  279.               m_ItemVec[i]->SelectItem();  
  280.               m_selectItemVec.push_back(m_ItemVec[i]);  
  281.           }  
  282.       }  
  283.  }  
  284.   
  285.  //有点击图标则返回true,否则返回false  
  286.  bool MainWidget::HitTest( QMouseEvent * event )  
  287.  {  
  288.      for (int i = 0; i < m_ItemVec.size(); ++i)  
  289.      {  
  290.          QRect rect = GetItemRect(i);  
  291.          if (rect.contains(event->pos()))  
  292.          {  
  293.             return true;  
  294.          }  
  295.      }  
  296.      return false;  
  297.  }  
  298.  //检查图标是否已经被选中  
  299.  bool MainWidget::isInVector(IconItemWidget* pItem )  
  300.  {  
  301.      for (int i = 0; i < m_selectItemVec.size(); ++i)  
  302.      {  
  303.          if (m_selectItemVec[i] == pItem)  
  304.          {  
  305.              return true;  
  306.          }  
  307.      }  
  308.      return false;  
  309.  }  


结果截图;

部件之间图标拖拽(使用很直观,效果很漂亮)_第1张图片

http://blog.csdn.net/hai200501019/article/details/11704343

你可能感兴趣的:(部件之间图标拖拽(使用很直观,效果很漂亮))