【问题标题】:how to know which item is clicked in a QML Listview using a QAbstractListModel subclass as listmodel如何使用 QAbstractListModel 子类作为 listmodel 知道在 QML Listview 中单击了哪个项目
【发布时间】:2015-02-25 19:32:14
【问题描述】:

我在列表视图中使用 QAbstractListModel 子类。而且我希望能够生成一个新的列表模型,该列表模型通过 c++ 根据单击的项目传递给 QML。

实现什么方法来判断列表中的哪个项目被点击了?

我已经在网上搜索了很多,但我似乎找不到最好的方法。

此代码创建了一个显示为顶层的组列表,它有一个嵌套列表显示在组列表中的每个项目下方。嵌套列表显然显示了该组的子级.. 所以我需要一种方法来获取正在单击的对象,以便我可以在后端使用它来生成其子级的新列表。

代码是:

import QtQuick 2.4
import QtQuick.Window 2.2
//import ListMode 1.0

Rectangle {
    height: 250
    width: 140
    color: "pink"

    //property var aNum: 0

    Component {
        id: folderDelegate

        Item {
            width: 140
            height: col2.childrenRect.height

            Column {
                id: col2
                anchors.left: parent.left
                anchors.right: parent.right


                Rectangle {
                    height: 20
                    width: parent.width
                    border.color: "black"

                    MouseArea {
                        anchors.fill: parent
                        onClicked: console.log(folderlist.contentItem) <<== this is not enough
                    }

                    Text {
                        anchors.horizontalCenter: parent.horizontalCenter
                        anchors.verticalCenter: parent.verticalCenter
                        id: name1
                        text: model.Name
                    }
                }
            }
        }
    }

    ListView {
        id: outer
        model: myModel
        delegate: groupsDelegate
        anchors.fill: parent
    }

    Component {
        id: groupsDelegate

        Item {
            width: 140
            height: col.childrenRect.height

            Column {
                id: col
                anchors.left: parent.left
                anchors.right: parent.right

                Text {
                    anchors.horizontalCenter: parent.horizontalCenter
                    id: t1
                    font.bold: true
                    font.underline: true
                    font.pointSize: 9
                    text: model.Name
                }

                ListView {
                    id: folderlist
                    model: treemodel.lists[treemodel.modIndex]
                    delegate: folderDelegate
                    contentHeight: contentItem.childrenRect.height
                    height: childrenRect.height
                    anchors.left: parent.left
                    anchors.right: parent.right
                    clip: true
                }
            }
        }
    }
}

我希望能够获取实际对象,而不是仅获取被单击项目的名称,因为我需要从对象中提取更多数据以正确识别新子项。

如果你们能帮帮我,我将不胜感激!

提前致谢!

【问题讨论】:

  • 由于 QAbstractListModel 没有这个功能,你必须在你的子类中自己编写。
  • @MrEricSir 感谢您的回答。所以你说我必须编写一个可以在单击项目时调用的函数。例如,当单击列表视图中的项目时,存储由 QAbstractmodel::data() 检索的对象的函数。然后使用该存储的指针创建新列表。那会是什么?
  • 你可以在你的子类中创建一个槽,返回给定索引值的项目。这样你就可以用 C++ 或 QML 对项目做任何你想做的事情。
  • @MrEricSir 我明白了,我想弄清楚我如何知道索引来自哪个模型。发送到插槽的索引并没有说明它来自哪个模型。只有一个索引,这还不够……我必须弄清楚这一点。毕竟我的主模型是一个包含子列表模型的树模型

标签: qt listview qml qabstractlistmodel


【解决方案1】:

主模型为每个项目设置了自己的唯一 ID。因此,当单击一个项目时,我会运行一个函数,该函数会根据单击的 ID + 名称来抓取和存储该项目

MouseArea {
   anchors.fill: parent

   onClicked :{
     treemodel.getObject(model.ID + ":" + model.Name)
     stackView.push(Qt.resolvedUrl("content/ButtonPage.qml"))     
   }
}

接下来,根据被点击的项目,我有填充不同 QList 项目的函数,这些项目被加载到 ButtonPage.qml。

调用的c++函数是:

Q_INVOKABLE void getObject(QString index) {
    clickedItemID = index;
    getClickedItem();
    getFilesByFolder();
}

现在,我不确定这是否是一个好的解决方案。但对我来说它有效。也许它也适用于其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2013-10-26
    • 2013-08-18
    • 2016-07-10
    相关资源
    最近更新 更多