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