QTree Widget設計は、ドラッグの問題がないことを解決します.


http://www.z8soft.com/article/mobile/201105/20110504299610.shtml
 
先日ノキアがQt 4.7を発表しました.新バージョンのQtには全く新しいQML技術が含まれています.先進的な記述性プログラミング言語と性能向上について.最近、この問題を提起した人がいます.QTree Widgetを設定するdragDropModeはInternalMoveです.そしてドラッグして、droppedの項目をcurrentに設定したいです.個人的にはこれは基本的な需要だと思いますが、研究してみると、Qtには直接的に利用できる方法やsignalがないことが分かりました.さらに研究して、実現は実現できるので、ちょっと煩わしいです.ここに列挙して、他のQt開発者の助けになりたいです.
あなたがitemをドラッグする時はまずitemを選択してください.だから、私たちはcurrentItem Chaged信号に応答してドラッグされた項目を得ることができます.もちろん、事情はそんなに簡単ではありません.currentItem Charngedの信号はドラッグする時だけではなく、普通のマウスクリックでもこの信号をトリガする可能性があります.またパラメータの内容からだけでなく、簡単なAPIでは区別できません.
この信号がドラッグ中に発生したかどうかを判断するために、dropEvent虚関数を書き換えることができます.ドラッグが発生すると、currentItem Changedの信号はdropEvent処理中に送信されます.ですから、私たちはdropEventに入る時にflagsを設定して、関数が終わる時にflagsをリセットします.その後、currentItem Chagedの溝において、flagsの値に基づいてドラッグ動作が発生するかどうかを決定し、さらにパラメータのprevは私たちが必要とするドラッグされた項目です.
関連コードの重要な部分は以下の通りです.

  
  
  
  
  1. tw = new TreeWidget(this, 10,2); // customized treewidget class  
  2. tw->setDragDropMode(QAbstractItemView::InternalMove);//drag drop  
  3. connect(tw, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(doCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));  
  4.  
  5.  
  6. void TreeWidget::dropEvent(QDropEvent*event)  
  7. {  
  8. qWarning() << "begin drop event....";//  
  9. QTreeWidget::dropEvent(event);  
  10. qWarning() << "end drop event....";//  
  11. }  
  12.  
  13.  
  14. void MainWin::doCurrentItemChanged(QTreeWidgetItem* cur, QTreeWidgetItem* prev)  
  15. {  
  16. if( prev)// , prev  
  17. qWarning() << "previous:" << prev->text(0);  
  18. }