@@ -185,7 +185,14 @@ void CFavoriteView::setupTreeView(QLayout *layout)
185185 return ;
186186 layout->addWidget (m_pTreeView);
187187
188+ // m_pTreeView->installEventFilter(this);
189+ m_pTreeView->viewport ()->installEventFilter (this );
188190 m_pTreeView->setAcceptDrops (true );
191+ m_pTreeView->setDragEnabled (true );
192+ m_pTreeView->setDragDropMode (QTreeView::InternalMove);
193+ m_pTreeView->setDefaultDropAction (Qt::MoveAction);
194+ m_pTreeView->setDropIndicatorShown (true );
195+
189196 m_pTreeView->setUniformRowHeights (true );
190197 m_pTreeView->setHeaderHidden (true );
191198
@@ -508,77 +515,83 @@ void CFavoriteView::slotExport()
508515
509516void CFavoriteView::dragEnterEvent (QDragEnterEvent *event)
510517{
511- qDebug (log) << " dragEnterEvent " ;
518+ qDebug (log) << Q_FUNC_INFO ;
512519 const CFavoriteMimeData* pData =
513520 qobject_cast<const CFavoriteMimeData*>(event->mimeData ());
514521 if (pData)
515522 {
516523 qDebug (log) << " dragEnterEvent acceptProposedAction" ;
517524 event->acceptProposedAction ();
518- }
525+ /*
526+ // 设置拖拽时的光标
527+ if (event->proposedAction() == Qt::MoveAction) {
528+ setCursor(Qt::DragMoveCursor);
529+ } else {
530+ setCursor(Qt::DragCopyCursor);
531+ }//*/
532+ } else
533+ event->ignore ();
519534}
520535
521536void CFavoriteView::dragMoveEvent (QDragMoveEvent *event)
522537{
538+ qDebug (log) << Q_FUNC_INFO;
539+ const CFavoriteMimeData* pData =
540+ qobject_cast<const CFavoriteMimeData*>(event->mimeData ());
541+ if (!pData)
542+ {
543+ event->ignore ();
544+ return ;
545+ }
523546}
524547
525548void CFavoriteView::dropEvent (QDropEvent *event)
526549{
527- qDebug (log) << " dropEvent" ;
550+ qDebug (log) << Q_FUNC_INFO << " drop action:" << event->dropAction ();
551+
528552 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData ());
529- if (!pData) return ;
530- /*
531- QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
532- if(!pModel) return;
553+ if (!pData || pData->m_Items .isEmpty () || !m_pTreeView || !m_pModel) {
554+ event->ignore ();
555+ return ;
556+ }
557+
558+ bool bRet = false ;
533559#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
534- auto index = indexAt(event->position().toPoint());
560+ auto idxParent = m_pTreeView-> indexAt (event->position ().toPoint ());
535561#else
536- auto index = indexAt(event->pos());
562+ auto idxParent = m_pTreeView-> indexAt (event->pos ());
537563#endif
538- if(index.isValid())
564+
565+ CFavoriteDatabase::Item item
566+ = m_pModel->data (idxParent, CFavoriteModel::RoleItem)
567+ .value <CFavoriteDatabase::Item>();
568+ if (0 < item.id && item.isFolder ())
539569 {
540- auto item = pModel->itemFromIndex(index);
541- if(item->data().isNull())
542- {
543- foreach(auto i, pData->m_Items)
544- {
545- qDebug(log) << "dropEvent:" << item->text();
546-
547- auto newItem = NewItem(i);
548- item->appendRow(newItem);
549- if(event->dropAction() == Qt::MoveAction)
550- pModel->removeRow(i.row(), i.parent());
551- }
552- } else
553- qWarning(log) << "Don't group node. the data:" << item->data();
554- }else{
555570 foreach (auto i, pData->m_Items )
556571 {
557- pModel->appendRow(NewItem(i));
558- if(event->dropAction() == Qt::MoveAction)
559- pModel->removeRow(i.row(), i.parent());
572+ if (event->dropAction () == Qt::MoveAction)
573+ bRet = m_pModel->Move (i, idxParent);
574+ else if (event->dropAction () == Qt::CopyAction)
575+ bRet = m_pModel->Copy (i, idxParent);
576+ if (!bRet) break ;
560577 }
578+ } else {
579+ qWarning (log) << " Don't group node. the id:" << item.id
580+ << " Folder:" << item.isFolder ();
561581 }
562- //*/
563- event->accept ();
564- }
565- /*
566- QStandardItem* CFavoriteView::NewItem(const QModelIndex &index)
567- {
568- QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
569- if(!pModel) return nullptr;
570- auto item = pModel->itemFromIndex(index);
571- if(!item) return nullptr;
572- auto ri = new QStandardItem(item->text());
573- ri->setData(item->data());
574- return ri;
582+
583+ if (bRet)
584+ event->accept ();
585+ else
586+ event->ignore ();
575587}
576588
577589void CFavoriteView::mousePressEvent (QMouseEvent *event)
578590{
591+ qDebug (log) << " mousePressEvent" ;
579592 if (event->button () == Qt::LeftButton)
580593 m_DragStartPosition = event->pos ();
581- QTreeView ::mousePressEvent(event);
594+ QWidget ::mousePressEvent (event);
582595}
583596
584597void CFavoriteView::mouseMoveEvent (QMouseEvent *event)
@@ -591,21 +604,60 @@ void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
591604 < QApplication::startDragDistance ())
592605 break ;
593606 qDebug (log) << " mouseMoveEvent drag" ;
607+ // 获取选中的索引
608+ QModelIndexList indexes = m_pTreeView->selectionModel ()->selectedIndexes ();
609+ if (indexes.isEmpty ()) {
610+ break ;
611+ }
594612 QDrag *drag = new QDrag (this );
595613 CFavoriteMimeData *pData = new CFavoriteMimeData ();
596- pData->m_Items = this->selectionModel()->selectedIndexes() ;
614+ pData->m_Items = indexes ;
597615 drag->setMimeData (pData);
598-
599616 Qt::DropAction dropAction = Qt::MoveAction;
600- if(event->modifiers() & Qt::ControlModifier)
617+ /*
618+ if(event->modifiers() & Qt::ControlModifier) {
601619 dropAction = Qt::CopyAction;
620+ // 设置拖拽时的光标
621+ // QIcon icon = QIcon::fromTheme("edit-copy");
622+ // QSize size(16, 16);
623+ // if(!icon.availableSizes().isEmpty())
624+ // size = icon.availableSizes().at(0);
625+ // drag->setDragCursor(icon.pixmap(size), Qt::MoveAction);
626+ }//*/
602627 drag->exec (dropAction);
603628 } while (false );
604629
605- QTreeView ::mouseMoveEvent(event);
630+ QWidget ::mouseMoveEvent (event);
606631}
607- // */
632+
608633bool CFavoriteView::eventFilter (QObject *watched, QEvent *event)
609634{
635+ // 处理 treeview 的事件
636+ if (watched == m_pTreeView->viewport ()) { // 处理 viewport 的事件
637+ qDebug (log) << Q_FUNC_INFO << " Viewport event:" << event->type ();
638+
639+ switch (event->type ()) {
640+ case QEvent::DragEnter:
641+ dragEnterEvent (static_cast <QDragEnterEvent*>(event));
642+ return true ;
643+ case QEvent::DragMove:
644+ dragMoveEvent (static_cast <QDragMoveEvent*>(event));
645+ return true ;
646+ case QEvent::Drop:
647+ dropEvent (static_cast <QDropEvent*>(event));
648+ return true ;
649+ case QEvent::MouseButtonPress:
650+ mousePressEvent (static_cast <QMouseEvent*>(event));
651+ // 不返回true,让 viewport 也处理
652+ break ;
653+ case QEvent::MouseMove:
654+ mouseMoveEvent (static_cast <QMouseEvent*>(event));
655+ // 不返回true,让 viewport 也处理
656+ break ;
657+ default :
658+ break ;
659+ }
660+ }
661+
610662 return QWidget::eventFilter (watched, event);
611663}
0 commit comments