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


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

    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- 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.  }  


    结果截图;

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

  • 相关阅读:
    React
    TypeScript 引入第三方包,报无法找到模块错误
    typescript / webpack报错“can only be default-imported using the 'esModuleInterop' flag
    React & Webpack & Typescript & scss
    Cannot set property ‘innerHTML’ of null 错误原因
    Kick Start 2019
    delet[] 和delete
    c++ 深入理解虚函数
    C++ 虚函数表解析
    typedef void(*Func)(void)的简单用途
  • 原文地址:https://www.cnblogs.com/findumars/p/5176090.html
Copyright © 2020-2023  润新知