2011-07-16 138 views
0

我正在使用QTreeWidget來顯示父節點樹,其中離開 節點。每個父節點可以有不同的葉節點,但葉節點應該沒有 子節點。用戶應該能夠通過將父母 拖到新位置來在父母之間移動葉子。爲了避免葉子落在其他葉子上,我有 只在葉子上設置ItemIsDragEnabled,而ItemIsDropEnabled在 父級節點上。如果QTreeWidget設置爲「SingleSelection」,這工作正常。 然而,如果將SelectionMode設置爲ExtendedSelection你能 選擇休假和父節點一起,把它們都在葉:http://i.stack.imgur.com/Kil3y.jpg(截圖)使用QTreeWidget(Qt4)混合父節點和子節點(Qt4)並拖放'

下面是示例代碼:

QTreeWidget *tree = this->ui->treeWidget; 
QTreeWidgetItem *item; 
QTreeWidgetItem *child; 
tree->setSelectionMode(QAbstractItemView::ExtendedSelection); 
tree->setDefaultDropAction(Qt::MoveAction); 
tree->setDragEnabled(true); 
tree->setAcceptDrops(true); 
tree->setDropIndicatorShown(true); 

// disable dropping of leaves as top level items 
tree->invisibleRootItem()->setFlags(Qt::ItemIsSelectable | 
       Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 

for (int i = 0; i < 2; i++) { 
    // create top level item 
    item = new QTreeWidgetItem(); 
    item->setText(0, "parent"); 
    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable 
        | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled); 

    // add 3 child items 
    for (int j = 0; j < 3; j++) { 
     child = new QTreeWidgetItem(); 
     child->setText(0, "child"); 
     child->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable 
         | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); 
     item->addChild(child); 
    } 

    // add item to tree 
    tree->addTopLevelItem(item); 
} 

我GOOGLE了很多,但不能想出一個解決方案。如何在使用ExtendedSelection時將孩子和父母節點保持在各自的級別?

我必須 子類QTreeWidget和重寫insertRows()?是否有任何方法可以攔截 在QTreeWidget上拖動操作,以便檢查操作是否正常? (如果 有辦法讓這個與QStandardItemModel/QTreeView則工作,我會 高興的太早)

回答

0

一個簡單的解決方法是一個小功能,連接到去除的選擇是不是所有項目的信號itemSelectionChanged與上次選擇的項目類型相同。作品對我來說是完美的(對於其他程序,如魔獸爭霸3觸發編輯器)

+1

謝謝,得試試 – nurio