2014-01-22 4 views
6

단일 루트 노드와 한 수준의 자식 노드 만 표시하는 QTreeWidget이 있습니다. 하위 노드의 재정렬을 허용해야합니다. 그들은 다시 부모가되어서는 안됩니다. 루트 항목은 다음과 같이 삽입QTreeWidget 드래그하여 하위 항목 재정렬

ui->levelElements->setSelectionMode(QAbstractItemView::SingleSelection); 
ui->levelElements->setDragEnabled(true); 
ui->levelElements->viewport()->setAcceptDrops(true); 
ui->levelElements->setDropIndicatorShown(true); 
ui->levelElements->setDragDropMode(QAbstractItemView::InternalMove); 

:

내가 QTreeWidget에있는 항목의 드래그 가능하게하는 방법이다 내가보기에 아이를 삽입 할 때

pItem = new QTreeWidgetItem(ui->levelElements); 
pItem->setText(0, node.firstChild().nodeValue()); 
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled); 

를, 그것은이다

pItem = new QTreeWidgetItem(); 
pItem->setText(0, strFileName); 
pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); 
pTreeRoot->addChild(pItem); 

이 시점에서 하위 항목을 드래그하고 '다시 삽입'할 수 있습니다. t "를 자식 항목 목록에 추가합니다. 나는 또한 그것을 루트 레벨로 옮길 수 있는데, 나는 그것을 원하지 않는다.

QT Creator v3을 사용 중이므로 QTreeWidget이 내 UI 정의 파일 내에 있습니다.

여기에 뭔가가 빠졌습니까?

+0

어쩌면이 도움이됩니다 : http://www.qtcentre.org/threads/32354-Qt-ItemIsDropEnabled-ignored-in -dragDropMode-QAbstractItemView-InternalMove – fritzone

답변

4

예를 들어 당신이 대체 할 수 있습니다 : 가상 무효 dropEvent (QDropEvent * 이벤트)

#include <QApplication> 
#include <QTreeWidget> 
#include <QTreeWidgetItem> 
#include <QDropEvent> 

class TreeView: public QTreeWidget 
{ 
public: 
    TreeView() 
    { 
    resize(200, 300); 

    setSelectionMode(QAbstractItemView::SingleSelection); 
    setDragEnabled(true); 
    viewport()->setAcceptDrops(true); 
    setDropIndicatorShown(true); 
    setDragDropMode(QAbstractItemView::InternalMove); 

    QTreeWidgetItem* parentItem = new QTreeWidgetItem(this); 
    parentItem->setText(0, "Test"); 
    parentItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled); 

    for(int i = 0; i < 10; ++i) 
    { 
     QTreeWidgetItem* pItem = new QTreeWidgetItem(parentItem); 
     pItem->setText(0, QString("Number %1").arg(i)); 
     pItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); 
     pItem->addChild(pItem); 
    } 
    } 

private: 
    virtual void dropEvent(QDropEvent * event) 
    { 
    QModelIndex droppedIndex = indexAt(event->pos()); 

    if(!droppedIndex.isValid()) 
     return; 

    QTreeWidget::dropEvent(event); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    TreeView widget; 
    widget.show(); 

    return a.exec(); 
} 
+0

정보를 보내 주셔서 감사합니다. 그러나 UI에서 초기화 한 클래스를 디자이너 파일에서 어떻게 변경할 수 있는지 알 수 없습니다 (Qt Creator를 사용하고 있음을 기억하십시오). 이 문제를 해결할 방법이 있습니까? – Simon

+0

Qt Creator에서 표준 QTreeWidget을 TreeView로 승격시킬 수 있습니다. (http://www.youtube.com/watch?v=Yt-YCxgEnyw) – Igor

+1

QTreeView 객체에 installEventFilter를 추가로 구현하여 QDropEvent를 잡을 수있는 추악한 솔루션 (회피 상속)이 있습니다. – Igor