2013-03-14 102 views
0

我一直在試圖拖放qtreeview中的子樹。當我執行放置操作時,樹會正確地重新排序,並且底層模型會更新,但是,項目選擇會在後續操作中搞砸。我無法想出一個可靠的方法來強制QT適當地重新繪製選擇。請參見下面的屏幕截圖:qtreeview:子樹的拖放導致選擇不正確

之前:

enter image description here

相關視圖代碼:

void View::dropEvent(QDropEvent *evt) 
{ 
    QTreeView::dropEvent(evt); 

    QModelIndex start = indexAt(_drag_start); 
    QModelIndex end = indexAt(evt->pos()); 

    _model->moveTo(start, end); 
} 

相關的模型

Before Drag and Drop

頂部節點拖動到節點2後代碼:

void Model::moveTo(QModelIndex& start, QModelIndex& end) 
{ 
    // ... omitted some error checking code to ensure start and end have the same parent 

    ModelData* a = (ModelData*) start.internalPointer(); 
    ModelData* b = (ModelData*) end.internalPointer(); 

    ModelData* list = (ModelData*) (parent(start).internalPointer()); 

    int idxa = list->indexOf(a); 
    int idxb = list->indexOf(b); 

    // underneath this is QList<...>::moveTo 
    list->moveTo(idxa, idxb); 

    QModelIndex p = this->parent(start); 

    emit dataChanged(index(0, 0, p), index(rowCount(p)-1, 1, p)); 
} 

有什麼建議嗎?謝謝!

回答

0

原來這是通過添加以下代碼在Model :: moveTo()方法固定:

... 
emit layoutAboutToBeChanged(); 
list->moveTo(...); 
emit layoutChanged(); 
...