Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. DelegateModelGroup together with a C++ model

DelegateModelGroup together with a C++ model

Scheduled Pinned Locked Moved Unsolved General and Desktop
1 Posts 1 Posters 364 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.
  • PowerNowP Offline
    PowerNowP Offline
    PowerNow
    wrote on last edited by PowerNow
    #1

    Hi,
    I'm looking for a way to show the content of a C++ model (QStandardItemModel) in a Qml ListView togehter with a DelegateModelGroup as filter. The Problem is the "get(int index)" function in DelegateModelGroup which delivers in normal a Javascript Object (unknown type) as return value.

    The C++ model consists of 3 roles (role1,...,role3). For illustration I created a small sample code.

    1.) C++ model

    Came::Came(QObject *parent) : QStandardItemModel(parent)
    {
        QStandardItem *it0 = new QStandardItem();
        it0->setData("flash", Came::role1);
        it0->setData("on", Came::role2);
        it0->setData(false, Came::role3);
        appendRow(it0);
    
        QStandardItem *it1 = new QStandardItem();
        it1->setData("flash", Came::role1);
        it1->setData("off", Came::role2);
        it1->setData(true, Came::role3);
        appendRow(it1);
    
        QStandardItem *it2 = new QStandardItem();
        it2->setData("flash", Came::role1);
        it2->setData("auto", Came::role2);
        it2->setData(false, Came::role3);
        appendRow(it2);
    }
    
    QVariantMap Came::get(const int rowNumber) const
    {
        QVariantMap map;
        QHash <int,QByteArray> roleName = roleNames();
        foreach (int i, roleName.keys())
        {
            map[roleName.value(i)] = data(index(rowNumber,0),i);
        }
        return map;
    }
    
    QHash<int, QByteArray> Came::roleNames() const
    {
         QHash<int, QByteArray> roles;
         roles[Came::role1] = "one";
         roles[Came::role2] = "two";
         roles[Came::role3] = "three";
         return roles;
    }
    
    void Came::updData(QModelIndex index, bool status)
    {
        setData(index,status,Came::role3);
    }
    

    2.) Qml ListView/DelegateModel

    Rectangle {
        id: iRoot
        width: parent.width
        height: parent.height
        color: "#aa000000"
        visible: mVis
    
        property bool mVis: false
    
        Rectangle {
            width: parent.width*0.6
            height: parent.height*0.6
            anchors.centerIn: parent
            color: "#343434"
            border.color: "#5F5F5F"
            radius: cRad*2
    
    
            DelegateModel {
                id: iDelModel
                model: Came
                property bool change: false
    
                delegate: Rectangle {
                    height: 25
                    width: 100
                    color: "transparent"
                    border.color: "white"
    
                    Item {
                        anchors.fill: parent
    
                        Text {
                            text: one + " : " + two + " : " + three
                        }
    
                        MouseArea {
                           anchors.fill: parent
                           onClicked: {
                               console.log(index);
                               Came.updData(iDelModel.modelIndex(index),true);
                           }
                       }
                    }
                }
    
                groups: [
                    DelegateModelGroup {
                        includeByDefault: false
                        name: "flash" }
                ]
    
                filterOnGroup: "flash"
    
                Component.onCompleted: {
                    var rowCount = Came.rowCount();
    
                    items.remove(0,rowCount);
                    for( var i = 0;i < rowCount;i++ ) {
                        var entry = Came.get(i); // Model in Qml -> Javascript Object; Model in C++ I tried with QVariantMap
                        console.log(entry);
                        if(entry["one"] == "flash") {
                            items.insert(i,entry, "flash");
                            console.log(items.get(i));
                        }
                    }
                }
            }
    
            ListView {
                id: iListView
                anchors.fill: parent
                model: iDelModel
                highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
                focus: true
            }
      }
    }
    

    Without DelegateModelGroup everything works fine. But with, the index of Delegate is always -1. Unfortunately the index is important to update the C++ model. Does someone know what I am doing wrong here? Or what is the normal way if I have one C++ model and want to show the content in different Qml ListViews regarding different groups?

    Thanks in advance...

    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