1. 程式人生 > >如何在Listview中拖拽其中的子Item移動其位置

如何在Listview中拖拽其中的子Item移動其位置

最近開發遇到一個需求,需要顯示的物件支援拖拽,一般的物件直接使用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();
}

以上,兩種情況的處理。然後就可以盡情的拖拽吧