Tôi đang theo cách tiếp cận được đưa ra trên http://qt-project.org/wiki/Drag_and_Drop_within_a_GridView.QML: GridView với các ô có thể di chuyển (kéo và thả)
Tôi có chương trình được trình bày. Kéo và thả đang hoạt động, nhưng sau khi thả, tôi nhận được không gian trống trong lưới của tôi. Làm thế nào tôi có thể cải thiện điều này?
Hơn nữa, tôi cũng nhận thấy rằng hàm indexAt() trong dòng 46 không hoạt động chính xác trong quá trình kéo. Vì vậy, tôi đã phải thêm tính toán rõ ràng của gridArea.index.
(CHỈNH SỬA) Có vẻ như không gian trống xuất hiện vì sau khi thả phần tử, nó được trả về vị trí ban đầu của nó (nó nằm bên dưới phần tử nhìn thấy được). GridView không được cập nhật và kết thúc ở trạng thái bất thường.
import QtQuick 1.1
GridView {
id: mainGrid
cellWidth: 165; cellHeight: 95
width: 5*cellWidth; height: 4*cellHeight
model: myModel
delegate: myButton
ListModel {
id: myModel
function createModel() {
for (var i=1; i<=20; i++) {
myModel.append({"display": i, "uid": i})
}
}
Component.onCompleted: {createModel()}
}
Component {
id: myButton
Rectangle {
id: item
width: mainGrid.cellWidth-5; height: mainGrid.cellHeight-5;
border.width: 1
property int uid: (index >= 0) ? myModel.get(index).uid : -1
Text {
anchors.centerIn: parent
text: display
font.pixelSize: 48
}
states: [
State {
name: "active"; when: gridArea.activeId == item.uid
PropertyChanges {target: item; x: gridArea.mouseX-80; y: gridArea.mouseY-45; z: 10; smooth: false}
}
]
}
}
MouseArea {
id: gridArea
anchors.fill: parent
hoverEnabled: true
preventStealing : true
//property int index: mainGrid.indexAt(mouseX, mouseY) //WHY IS THIS NOT WORKING RELIABLE?
property int mX: (mouseX < 0) ? 0 : ((mouseX < mainGrid.width - mainGrid.cellWidth) ? mouseX : mainGrid.width - mainGrid.cellWidth)
property int mY: (mouseY < 0) ? 0 : ((mouseY < mainGrid.height - mainGrid.cellHeight) ? mouseY : mainGrid.height - mainGrid.cellHeight)
property int index: parseInt(mX/mainGrid.cellWidth) + 5*parseInt(mY/mainGrid.cellHeight) //item underneath cursor
property int activeId: -1 //uid of active item
property int activeIndex //current position of active item
onPressAndHold: {
activeId = mainGrid.model.get(activeIndex=index).uid
}
onReleased: {
activeId = -1
}
onPositionChanged: {
if (activeId != -1 && index != -1 && index != activeIndex) {
mainGrid.model.move(activeIndex, activeIndex = index, 1)
}
}
}
}