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. [SOLVED] Accessing properties in QML Delegate for imported C++ objects / ListView
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] Accessing properties in QML Delegate for imported C++ objects / ListView

Scheduled Pinned Locked Moved QML and Qt Quick
4 Posts 2 Posters 3.7k Views 1 Watching
  • 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.
  • S Offline
    S Offline
    serdef
    wrote on last edited by
    #1

    Hello,

    I am making a parameter edit screen with QML, QT 5.3. I am importing a C++ map of objects as a Listview model, and it almost works : All rectangles appear, but no text in it.
    I get these QML errors. "ReferenceError: prop_name is not defined" "ReferenceError: prop_description is not defined"
    It seems the list exist, was constructed correctly with the right number of items, but I cannot access the properties. Probably I am still doing something wrong, but I can't find what, from all information I find online, I think my effort could work, but it does not. I implemented a workaround to get the data from a C++ map into a variant list, and this seems ok, but probably I still made a mistake. I don't see it.

    I'd appreciate if you experts had a look, and tell me your opinion, how can I make this work ?
    Is this the wrong approach ?

    You can see the code fragments below, ParamScreen.qml is included in
    marpgui.qml :

    @// main initialisation :

    QMap<QString, MaQParam *> marpParamMap;
    QVariantList marpParamList;

    MARPGUI::MARPGUI(JSONRPCUDP* param_jsonrpcserver)
    {
    MARP_jsonrpcserver = param_jsonrpcserver;
    GUIRootContext = viewer.rootContext();
    qmlRegisterType<MaQParam>("MaQParam", 1, 0, "MaQParam");
    GUIRootContext->setContextProperty("marpParamList", QVariant::fromValue(marpParamList));
    viewer.setMainQmlFile(QStringLiteral("qml/QT_UDP_QML/MARPGUI.qml"));
    viewer.showExpanded();
    GUIRootObject = viewer.rootObject();
    }

    //--- maqparam.h

    #ifndef MAQPARAM_H
    #define MAQPARAM_H

    #include <QObject>

    class MaQParam : public QObject
    {
    Q_OBJECT
    public:
    explicit MaQParam(QObject *parent=0, QString par_name="unknown",QString par_value="0",QString par_min="0",QString par_max="100", QString par_description="no comment");
    Q_PROPERTY(QString prop_name READ getname NOTIFY nameChanged)
    Q_PROPERTY(QString prop_value MEMBER m_value )
    Q_PROPERTY(QString prop_min MEMBER m_min )
    Q_PROPERTY(QString prop_max MEMBER m_max )
    Q_PROPERTY(QString prop_description MEMBER m_description)
    QString getname(void);
    signals:
    void nameChanged();
    public slots:

    private:
    QString m_name;
    QString m_value;
    QString m_min;
    QString m_max;
    QString m_description;
    };

    #endif // MAQPARAM_H

    //--- maqparam.c

    #include "maqparam.h"

    /*
    MaQParam::MaQParam(QObject *parent) : QObject(parent)
    {
    }
    */

    MaQParam :: MaQParam(QObject *parent, QString par_name,QString par_value,QString par_min,QString par_max, QString par_description) : QObject(parent)
    {
    m_name = par_name;
    m_value = par_value;
    m_min = par_min;
    m_max = par_max;
    m_description = par_description;
    }

    QString MaQParam::getname(void)
    {
    return(m_name);
    }

    // ParamScreen.qml

    import QtQuick 2.2
    import QtQuick.Dialogs 1.1
    import QtGraphicalEffects 1.0
    import QtQuick.Controls 1.2
    import QtQuick.Controls.Styles 1.2
    import QtQuick.Layouts 1.1
    import MaQParam 1.0

    Rectangle {
    x: 0
    y: 0
    anchors.fill: parent
    gradient: Gradient {
    GradientStop {
    id: gradientStop3
    position: 0
    color: "#5d62cb"
    }

        GradientStop {
            position: 1
            color: "#d7d9fa"
        }
    }
    
    Button {
        id: closeparamlist_button
        x: 300
        y: 325
        width: 50
        text: qsTr("Close")
        onClicked : parent.z = -1;
    }
    
    
    RowLayout {
        id: parameditrowlayout
        anchors.fill: parent
    
        Component {
            id: paramlijstDelegate
            Row {
                id: paramlijst
                Rectangle {
                    width: 250
                    height: 60
                    color: "dark blue"
                    radius : 5
                    MouseArea{
                           id: paramlistMouseArea
                           anchors.fill: parent
                           }
    
                    Column {
                        width: parent.width
                        anchors.horizontalCenter: parent.horizontalCenter
                        Text { width: parent.width; anchors.horizontalCenter: parent.horizontalCenter; font.pointSize : 16 ; horizontalAlignment:Text.AlignHCenter; text: prop_name; color: paramlijst.ListView.view.paramlijst_color   }
                        Text { width: parent.width;  anchors.horizontalCenter: parent.horizontalCenter; font.pointSize : 16 ; horizontalAlignment:Text.AlignHCenter; text: prop_description; color: paramlijst.ListView.view.paramlijst_color   }
                    }
                }
    
            }
        }
    
    
    
        ListView {
            width : 260
            height : 360
            anchors.top : parameditrowlayout.top
            anchors.left: parameditrowlayout.left
            property color paramlijst_color: "white"
            //model: paramlijstModel
            model: marpParamList
            delegate: paramlijstDelegate
            anchors.margins: 20
            clip: true
            spacing: 5
    
        }
        Item{
            id: editWindow
            anchors.top : parameditrowlayout.top
            anchors.left: parameditrowlayout.left + parameditrowlayout.width/2
            width : 350
            ParamEdit{
                id: paramedit
    
            }
    
        }
    
    }
    

    }

    // adding new parameters happens with this code (if a parameter exists it is updated instead of added)

       MaQParam * pQParam;
        pQParam = new MaQParam((QObject *)0,nameStr,valueStr,minStr,maxStr,descriptionStr);
        marpParamMap.insert(nameStr,pQParam);
        marpParamList.clear();
        foreach (MaQParam * curQParam,marpParamMap.values())
    
        {
            marpParamList.append( QVariant::fromValue(curQParam));
        }
        GUIRootContext->setContextProperty("marpParamList", QVariant::fromValue(marpParamList));
    

    ...
    @

    1 Reply Last reply
    0
    • V Offline
      V Offline
      Vincent007
      wrote on last edited by
      #2

      Maybe you should "qabstractitemmodel":http://qt-project.org/doc/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel

      1 Reply Last reply
      0
      • S Offline
        S Offline
        serdef
        wrote on last edited by
        #3

        Hi,
        I found the solution, it was something really simple i had overlooked :
        It should access the properties through model.modelData
        so use model.modelData.prop_name instead of prop_name

        It works now, the delegate becomes :
        @Component {
        id: paramlijstDelegate
        Row {
        id: paramlijst
        Rectangle {
        width: 250
        height: 60
        color: "#353535"
        radius : 5
        MouseArea{
        id: paramlistMouseArea
        anchors.fill: parent
        }

                        Column {
                            width: parent.width
                            anchors.horizontalCenter: parent.horizontalCenter
                            Text { width: parent.width; anchors.horizontalCenter: parent.horizontalCenter; font.pointSize : 18 ; horizontalAlignment:Text.AlignHCenter; text : model.modelData.prop_name; color: "#00B4FF"   }
                            Text { width: parent.width;  anchors.horizontalCenter: parent.horizontalCenter; font.pointSize : 14 ; horizontalAlignment:Text.AlignHCenter; text:  model.modelData.prop_value; color: "#FFFFFF" }
                        }
                    }
        
                }
            }
        

        @

        1 Reply Last reply
        0
        • S Offline
          S Offline
          serdef
          wrote on last edited by
          #4

          Thanks Vincent, for the suggestion to use qabstractitemmodel.
          It looks suitable. When I find the time, I'll try this too, it may be more efficient.

          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