如何在Listview中拖拽其中的子Item移動其位置
阿新 • • 發佈:2019-01-09
最近開發遇到一個需求,需要顯示的物件支援拖拽,一般的物件直接使用dargarea即可。但我用的是Listview來顯示,而且是自己定義的listmodel,可以說是相當的煩。
1、一種情況,如果是使用qml中的listmodel則直接呼叫model的move方法進行移動:核心程式碼為
MouseArea
{
id:mos;
anchors.fill: parent;
onMouseXChanged:
{
var pore = list.indexAt( mos.mouseX + dlt.x, mos.mouseY + dlt.y );
console.debug("pore = ",pore);
if(index !== pore && pore>= 0)
{
root.model.move(index, index, pore);
}
}
} 2、是當自己定義listmodel時,他的移動也必須自己實現,直接上程式碼 void myModel::move(int srcFirst, int srcLast,int desIndex)
{
//兩種情況----為了能看懂邏輯寫的簡單點
int tmp_desIndex= 0;
//1、從前往後拖拽
if(srcFirst < desIndex)
{
//desIndex不可以在範圍(srcFirst,srcFirst+1),如果是則此時desIndex必須+1
tmp_desIndex = srcFirst + 1 >= desIndex? desIndex + 1 : desIndex;
}
else//2、從後往前
{
tmp_desIndex = desIndex;
} //注意,結合上面的拖拽訊號處理,一次只能移動一個位置,所以srcFirst == srcLast
emit beginMoveRows(QModelIndex(),srcFirst,srcLast,QModelIndex(), tmp_desIndex);
m_datas.move(srcFirst,desIndex);//在此處自己實現c++資料的移動。訊號只能幫你在qml中實現移動
emit endMoveRows();
}
以上,兩種情況的處理。然後就可以盡情的拖拽吧