Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Can Qt Qml DelegateModel items have different indexes in multiple groups?
Forum Update on Monday, May 27th 2025

Can Qt Qml DelegateModel items have different indexes in multiple groups?

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
1 Posts 1 Posters 607 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    fun4jimmy
    wrote on last edited by
    #1

    After following the tutorial on how to sort ListViews in Qml using DelegateModels I encountered a crash bug in Qt caused by the way Qml updates its components QTBUG-53677. It seems that removing model items from the "unsorted" group causes the crash reliably.

    In an attempt to work around this I tried to leave the items in the "unsorted" group as well as adding them to the default "items" group and moving them. After quite a bit of debugging it seems that the call to move causes the index to update for all groups that the item belongs to. Is this the expected behaviour or is this a bug in Qt? DelegateModels seem much less powerful if they have to share an index across DelegateModelGroups.

    I made a simple example in Qt Creator that illustrates the problem.

    import QtQuick 2.5
    import QtQuick.Window 2.2
    import QtQml.Models 2.1
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        ListModel {
            id: dataModel
            ListElement {
                name: "Polly"
            }
            ListElement {
                name: "Penny"
            }
        }
    
        DelegateModel {
            id: visualModel
    
            groups: [
                VisualDataGroup {
                    id: unsortedItems
                    name: "unsorted"
    
                    includeByDefault: true
                },
                VisualDataGroup {
                    id: sortedItems
                    name: "sorted"
    
                    includeByDefault: true
                }
            ]
        }
    
        Component.onCompleted: {
            var item = unsortedItems.get(1)
            console.assert(item.unsortedIndex === 1, "item.unsortedIndex was initialised incorrectly")
            console.assert(item.sortedIndex === 1, "item.sortedIndex was initialised incorrectly")
    
            // only expecting this to change item.sortedIndex
            sortedItems.move(1, 0)
    
            console.log(item.unsortedIndex, item.sortedIndex)
            console.assert(item.unsortedIndex === 1, "item.unsortedIndex has also been modified.")
            console.assert(item.sortedIndex === 0, "item.sortedIndex is incorrect.")
            }
            model: dataModel
            delegate: Text {
                text: name
            }
        }
    
        Rectangle {
            anchors.fill: parent
    
            ListView {
                anchors.fill: parent
                model: visualModel
            }
        }
    }
    

    The original problem was seen in a large c++ application using Qt 5.5.1. The simple example was tested in Qt Creator with Qt 5.6.1.

    The documentation on ModelDelegateGroup is a bit thin so it may be that I have the syntax wrong. I tried debugging the c++ implementation (qtdeclarative\src\qml\types\qqmldelegatemodel.cpp) but couldn't see how the data structure was storing the group information.

    I previously asked this on stackoverflow but got no answers so I'm reposting here.

    Thanks,
    James

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved