gpt4 book ai didi

qt - 拖放项目时滚动项目

转载 作者:行者123 更新时间:2023-12-02 08:29:29 25 4
gpt4 key购买 nike

关注此Qt tutorial我写了这个简单的代码。有一个水平 ListView ,上面有一些简单的彩色矩形作为模型项的委托(delegate)。

import QtQuick 2.5
import QtQuick.Window 2.0
import QtQml.Models 2.2

Window {
visible: true
width: 300
height: 120
title: qsTr("Hello World")

Rectangle {
anchors.fill: parent;

ListView{
id: timeline
anchors.fill: parent
orientation: ListView.Horizontal
model: visualModel
delegate: timelineDelegate

moveDisplaced: Transition {
NumberAnimation{
properties: "x,y"
duration: 200
}
}

DelegateModel {
id: visualModel
model: timelineModel
delegate: timelineDelegate
}

Component {
id: timelineDelegate


MouseArea {
id: dragArea

width: 100; height: 100

property bool held: false

drag.target: held ? content : undefined
drag.axis: Drag.XAxis

onPressAndHold: held = true
onReleased: held = false

Rectangle {
id: content

anchors { horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter }
width: 100
height: 100

color: colore
opacity: dragArea.held ? 0.8 : 1.0

Drag.active: dragArea.held
Drag.source: dragArea
Drag.hotSpot.x: width / 2
Drag.hotSpot.y: height / 2

states: State{
when: dragArea.held
ParentChange { target: content; parent: timeline }
AnchorChanges {
target: content
anchors { horizontalCenter: undefined; verticalCenter: undefined }
}
}
}

DropArea {
anchors.fill: parent
onEntered: {
visualModel.items.move( drag.source.DelegateModel.itemsIndex, dragArea.DelegateModel.itemsIndex)
timeline.currentIndex = dragArea.DelegateModel.itemsIndex
}
}
}
}

ListModel {
id: timelineModel
// @disable-check M16
ListElement { colore: "blue" }
// @disable-check M16
ListElement { colore: "orange" }
// @disable-check M16
ListElement { colore: "red" }
// @disable-check M16
ListElement { colore: "yellow" }
// @disable-check M16
ListElement { colore: "green" }
// @disable-check M16
ListElement { colore: "yellow" }
// @disable-check M16
ListElement { colore: "red" }
// @disable-check M16
ListElement { colore: "blue" }
// @disable-check M16
ListElement { colore: "green" }
}
}
}
}

如果我按住一个Item,我可以将它与另一个元素交换,从而产生漂亮的移动效果。
当列表中有很多项目并且目标位置超出可见项目时,问题就开始了。我可以拖动项目广告将其移动到右边框或左边框附近...这里移动效果绝对不好。

当项目到达边界附近时,是否有正确滚动列表的最佳实践?
我希望在项目接触边框之前开始滚动!

不错的

The nice one

坏的

The bad one

最佳答案

ListViewListView.currentIndex 时滚动被改变了。即拖放区域的最后一行:

timeline.currentIndex = dragArea.DelegateModel.itemsIndex

表示当前索引(始终可见)是拖动的项目。然而,如果拖动的项目到达边界,用户期望不仅看到拖动的项目,而且看到它旁边的项目。因此,您需要向 currentIndex 添加一项:

timeline.currentIndex = dragArea.DelegateModel.itemsIndex + 1

现在,如果将项目拖动到右边框, ListView 会正确滚动到右侧。为了使其在左边框和右边框中都可用,我们需要添加一些数学知识:

MouseArea {
id: dragArea

property int lastX: 0
property bool moveRight: false

onXChanged: {
moveRight = lastX < x;
lastX = x;
}

//....

DropArea {
anchors.fill: parent
onEntered: {
visualModel.items.move( drag.source.DelegateModel.itemsIndex,
dragArea.DelegateModel.itemsIndex)
if (dragArea.moveRight)
timeline.currentIndex = dragArea.DelegateModel.itemsIndex + 1
else
timeline.currentIndex = dragArea.DelegateModel.itemsIndex - 1
}
}
}

关于qt - 拖放项目时滚动项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40789412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com