как узнать, какой элемент щелкнут в списке QML, используя подкласс QAbstractListModel в качестве модели списка

я использую подкласс QAbstractListModel в списке. И я хочу иметь возможность генерировать новую модель списка, которая передается в 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
                }
            }
        }
    }
}

вместо того, чтобы получать только имя элемента, по которому щелкнули, я хотел бы иметь возможность получить фактический объект, потому что мне нужно извлечь больше данных из объекта, чтобы правильно идентифицировать новых детей.

если бы вы, ребята, могли бы мне помочь, я был бы очень признателен!

Заранее спасибо!


person CantThinkOfAnything    schedule 25.02.2015    source источник
comment
Поскольку QAbstractListModel не имеет этой функции, вам придется написать ее самостоятельно в своем подклассе.   -  person MrEricSir    schedule 25.02.2015
comment
@MrEricSir спасибо за ответ. Итак, вы говорите, что мне придется написать функцию, которую можно будет вызывать при нажатии на элемент. Например, функция, которая сохраняет объект, полученный QAbstractmodel::data() при щелчке элемента в списке. А затем использовать этот сохраненный указатель для создания новых списков. это будет что-то?   -  person CantThinkOfAnything    schedule 26.02.2015
comment
Вы можете просто создать слот в своем подклассе, который возвращает элемент для заданного значения индекса. Таким образом, вы можете делать с элементом все, что хотите, либо на C++, либо на QML.   -  person MrEricSir    schedule 26.02.2015
comment
@MrEricSir, я понимаю, я пытаюсь понять, как я узнаю, из какой модели взят индекс. Индекс, который отправляется на слот, не говорит, из какой он модели. Только с индексом этого будет недостаточно... мне придется это выяснить. В конце концов, моя основная модель — это древовидная модель, содержащая вложенные модели списка.   -  person CantThinkOfAnything    schedule 26.02.2015


Ответы (1)


основная модель настроена так, чтобы каждый элемент имел свой уникальный идентификатор. Поэтому, когда элемент нажат, я запускаю функцию, которая захватывает и сохраняет элемент на основе идентификатора + имени, которое было нажато.

MouseArea {
   anchors.fill: parent

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

затем, в зависимости от элемента, который был нажат, у меня есть функции, которые заполняют разные элементы QList, которые загружаются в ButtonPage.qml.

вызываемая функция в С++:

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

теперь я не уверен, что это хорошее решение. Но для меня это работает. Может быть, это сработает и для кого-то еще.

person CantThinkOfAnything    schedule 03.03.2015