QTreeWidget設計解決沒有拖動項問題
前不久諾基亞發布了Qt 4.7,新版本的Qt包括了全新的QML技術:一個先進的描述性編程語言,以及對于性能的提升。最近總有人提了這個問題:設置QTreeWidget的dragDropMode為InternalMove,然后拖動項,希望把dropped的項設為current。個人認為這是個比較基本的需求,但研究了一下,發現Qt里竟然沒有直接可用的方法或者signal可以得到這些信息。進一步研究,實現是可以實現的,有點小繁瑣,這里列出來,希望對其他Qt開發者有所幫助。
在你拖拽item的時候首先需要選中item, 所以我們可以通過響應currentItemChanged信號得到被拖動的項。 當然事情沒那么簡單。因為currentItemChanged的信號不光是拖拽的時候會發出, 還有可能是普通的鼠標點擊也會觸發這個信號,而且單從參數的內容或者用簡單的API是區分不出這兩種情況的。
為了判斷這個信號是不是在拖拽期間發生的,可以重寫 dropEvent虛函數。在拖拽發生時,currentItemChanged的信號是在dropEvent處理過程中發出。所以我們可以在進入dropEvent時設置一個flag, 函數結束時重置該flag。 然后在currentItemChanged的槽里根據flag的值確定拖拽動作是否發生, 進而參數中的prev就是我們需要的被拖動的項。
相關的代碼列舉重要部分如下:
- tw = new TreeWidget(this, 10,2); // customized treewidget class
- tw->setDragDropMode(QAbstractItemView::InternalMove);//drag drop
- connect(tw, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(doCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
- void TreeWidget::dropEvent(QDropEvent*event)
- {
- qWarning() << "begin drop event....";//在這里設置標志
- QTreeWidget::dropEvent(event);
- qWarning() << "end drop event....";//在這里重置標志
- }
- void MainWin::doCurrentItemChanged(QTreeWidgetItem* cur, QTreeWidgetItem* prev)
- {
- if( prev)//在這里判斷標志, prev即是被拖拽的項
- qWarning() << "previous:" << prev->text(0);
- }
【編輯推薦】