使用 ListView 的拖放功能来创建库存 UI

2024-02-13

我想使用 ListView 为我的游戏创建一个库存 UI,其中可以通过在关卡中拖放项目来将其从库存中删除。如果某个物品没有正确放置(仍在物品栏内),则应将其放回拖动前的位置。

我有以下代码,但即使在查看了之后我也不知道如何实现我想要的拖放示例 http://qt-project.org/doc/qt-5/qtquick-draganddrop-example.html.

import QtQuick 2.3

Rectangle {
    id: root
    width: 400
    height: 400

    ListView {
        id: listView
        width: parent.width / 2
        height: parent.height

        model: ListModel {
            Component.onCompleted: {
                for (var i = 0; i < 10; ++i) {
                    append({value: i});
                }
            }
        }

        delegate: Item {
            id: delegateItem
            width: listView.width
            height: 50

            Rectangle {
                id: dragRect
                width: listView.width
                height: 50
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
                color: "salmon"
                border.color: Qt.darker(color)

                Text {
                    anchors.centerIn: parent
                    text: modelData
                }

                MouseArea {
                    id: mouseArea
                    anchors.fill: parent
                    drag.target: dragRect
                }

                Drag.hotSpot.x: dragRect.width / 2
                Drag.hotSpot.y: dragRect.height / 2
            }
        }
    }

    Rectangle {
        width: parent.width / 2
        height: parent.height
        anchors.right: parent.right
        color: "#aaff0011"

        DropArea {
            id: dropArea
            anchors.fill: parent
        }
    }
}

您可以使用以下代码来实现此目的:

import QtQuick 2.3

Rectangle {
    id: root
    width: 400
    height: 400

    ListView {
        id: listView
        width: parent.width / 2
        height: parent.height

        property int dragItemIndex: -1

        model: ListModel {
            Component.onCompleted: {
                for (var i = 0; i < 10; ++i) {
                    append({value: i});
                }
            }
        }

        delegate: Item {
            id: delegateItem
            width: listView.width
            height: 50

            Rectangle {
                id: dragRect
                width: listView.width
                height: 50
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
                color: "salmon"
                border.color: Qt.darker(color)

                Text {
                    anchors.centerIn: parent
                    text: modelData
                }

                MouseArea {
                    id: mouseArea
                    anchors.fill: parent
                    drag.target: dragRect

                    drag.onActiveChanged: {
                        if (mouseArea.drag.active) {
                            listView.dragItemIndex = index;
                        }
                        dragRect.Drag.drop();
                    }
                }

                states: [
                    State {
                        when: dragRect.Drag.active
                        ParentChange {
                            target: dragRect
                            parent: root
                        }

                        AnchorChanges {
                            target: dragRect
                            anchors.horizontalCenter: undefined
                            anchors.verticalCenter: undefined
                        }
                    }
                ]

                Drag.active: mouseArea.drag.active
                Drag.hotSpot.x: dragRect.width / 2
                Drag.hotSpot.y: dragRect.height / 2
            }
        }
    }

    Rectangle {
        width: parent.width / 2
        height: parent.height
        anchors.right: parent.right
        color: "#aaff0011"

        DropArea {
            id: dropArea
            anchors.fill: parent
            onDropped: {
                listView.model.remove(listView.dragItemIndex);
                listView.dragItemIndex = -1;
            }
        }
    }
}

在这个例子中需要注意一些事情:

  1. 我们存储dragItemIndex这样我们就知道哪个项目被拖动。我们也许可以通过查看 DropArea 来实现同样的目标拖拽源 http://qt-project.org/doc/qt-5/qml-qtquick-droparea.html#drag.source-prop属性,但是我们必须在委托中公开一个索引属性,并且文档不鼓励在代表中存储状态 http://qt-project.org/doc/qt-5/qml-qtquick-listview.html#example-usage.

  2. 为了实现“项目被放回拖动失败时的位置”功能,我们做了dragRect实际委托项目的子项,以便它有一个要坚持的父项。如果我们不这样做,该项目的父级将是 ListView,并且当未成功放置时,它只会位于上次拖动的位置。

  3. 我们使用与拖放示例 http://qt-project.org/doc/qt-5/qtquick-draganddrop-example.html#tiles;拖动时,我们希望从项目中删除锚点并让它自由拖动。如果拖动失败,when状态的条件(dragRect.Drag.active) 变为 false,并且该项目的父级回到尚未从列表视图中的原始位置移动的委托项目。锚也被恢复。这是国家的一个有用的特征;能够隐式恢复以前的状态。

  4. In the MouseArea's drag.onActiveChanged信号处理程序,我们称之为dragRect.Drag.drop()以便我们可以响应该事件DropArea's onDropped信号处理程序,并删除该项目。该项目被删除后,我们重置dragItemIndex到无效的索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ListView 的拖放功能来创建库存 UI 的相关文章

  • 如何正确绑定和更新 Xamarin.Forms ListView?

    使用 MVVM 模式 我有一个模型 ViewModel 和视图 其中包含一个 ListView ListView 绑定到 ViewModel 的成员 该成员是 Model 类的 ObservableCollection 我可以使初始显示的绑
  • getView 中的位置索引始终返回 0

    我想实现一个 ListView 其中每行内都有删除按钮 我唯一的问题是 当我单击某些行的 删除 Btn 时 位置 0 的行刚刚被删除 我认为 getView 中的 Position 参数无法更新并且始终为 0 值 我应该怎么办 Thanks
  • 第二次单击时 ListViewItem 出现 ArgumentOutOfRangeException

    当我第二次单击时 下面的方法给出了 ArgumentOutOfRangeException 错误 并表示索引 0 不是有效索引 第一次点击就可以了 ListView FullRowSelect 设置为 true 我发现按 ALT 和 CON
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • Android 在列表视图中添加视图

    文档说不支持 listViewObj addView 方法 我想将视图添加到列表末尾而不刷新它 如何做到这一点 您可以通过以下方式向 ListView 添加页脚 View footerView getLayoutInflater infla
  • 创建后如何更新使用 AlertDialog.builder 构建的 AlertDialog 列表中的项目数组

    我使用 AlertDialog builder 创建了一个对话框 显示可以检查的多项选择列表 我设置了初始的项目名称集及其检查状态 builder setMultiChoiceItems saveTargets names saveTarg
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 检查从 arrayadapter 获取的复选框

    我有标题清单 CheckBox 我想控制默认检查哪一个 所以我试图获得正确的视图并检查它 但由于某种原因它不起作用 知道为什么吗 form checkbox item xml
  • Jquery 拖放和克隆

    嗨 我需要实现这个 我有一套可掉落的物品 基本上我是在服装上掉落设计 并且我正在掉落一个克隆 如果我不喜欢删除的对象 设计 我想通过执行隐藏之类的操作来删除它 但我无法做到这一点 请帮我 这是代码 var clone document re
  • 拖动元素时是否禁用 mousemove 事件?

    我试图通过在拖动元素时观察文档上的 mousemove 事件来移动元素 使用 html5 拖放 我在文档的父元素上添加了一个 mousemove 侦听器 每当我移动鼠标时都会触发该监听器 但是一旦我开始拖动另一个子元素 我就不再看到 mou
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • Kendo Ui 像 Windows 桌面一样可拖动

    我需要模拟桌面图标拖放 我这样做 draggable kendoDraggable container desktop hint function return draggable clone dragend function e cons
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • WPF:通过拖放重新排序 WrapPanel 内容?

    我正在寻找一种通过拖放对 WPF WrapPanel 的内容 项目 重新排序的方法 我只想单击一个项目并将其拖动到新位置 据我了解 这是一项非常常见的任务 我想知道有人已经这样做了 或者知道如何实现此功能 我已经进行了谷歌搜索 但什么也没找
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma

随机推荐