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. [SOLVED] Cascaded QVariantList exposed to QML causes Error: Cannot assign [undefined] to QString
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] Cascaded QVariantList exposed to QML causes Error: Cannot assign [undefined] to QString

Scheduled Pinned Locked Moved General and Desktop
16 Posts 2 Posters 9.4k Views 2 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.
  • C CertaBit

    @p3c0 just read it somewhere else, does not work with or w/o it...
    was just a try...

    p3c0P Offline
    p3c0P Offline
    p3c0
    Moderators
    wrote on last edited by
    #4

    @CertaBit So what is modelData ?

    157

    C 1 Reply Last reply
    0
    • p3c0P p3c0

      @CertaBit So what is modelData ?

      C Offline
      C Offline
      CertaBit
      wrote on last edited by CertaBit
      #5

      @p3c0 thought it's the current item. So if it's a variantlist of DA_Order it should be the current DA_Order item.

      the result is:

      Error: Cannot assign [undefined] to QString

      p3c0P 1 Reply Last reply
      0
      • C CertaBit

        @p3c0 thought it's the current item. So if it's a variantlist of DA_Order it should be the current DA_Order item.

        the result is:

        Error: Cannot assign [undefined] to QString

        p3c0P Offline
        p3c0P Offline
        p3c0
        Moderators
        wrote on last edited by p3c0
        #6

        @CertaBit Not I guess. Try following

        //Access first QVarianList and set as model
        model: MyObject.CoatingCurrentCarrierOrders[0] 
        ...
        //Access the individual item's property in that model
        text: MyObject.CoatingCurrentCarrierOrders[0][index].DetailInformation_s 
        

        Edit: Changed list to CoatingCurrentCarrierOrders in text

        157

        C 1 Reply Last reply
        0
        • p3c0P p3c0

          @CertaBit Not I guess. Try following

          //Access first QVarianList and set as model
          model: MyObject.CoatingCurrentCarrierOrders[0] 
          ...
          //Access the individual item's property in that model
          text: MyObject.CoatingCurrentCarrierOrders[0][index].DetailInformation_s 
          

          Edit: Changed list to CoatingCurrentCarrierOrders in text

          C Offline
          C Offline
          CertaBit
          wrote on last edited by
          #7

          @p3c0 gives: TypeError: Cannot read property '0' of undefined

          p3c0P 1 Reply Last reply
          0
          • C CertaBit

            @p3c0 gives: TypeError: Cannot read property '0' of undefined

            p3c0P Offline
            p3c0P Offline
            p3c0
            Moderators
            wrote on last edited by
            #8

            @CertaBit Did you notice the change that I edited in earlier post ?
            Changed list to CoatingCurrentCarrierOrders in text. Did you try this change ?

            157

            C 1 Reply Last reply
            0
            • p3c0P p3c0

              @CertaBit Did you notice the change that I edited in earlier post ?
              Changed list to CoatingCurrentCarrierOrders in text. Did you try this change ?

              C Offline
              C Offline
              CertaBit
              wrote on last edited by CertaBit
              #9

              @p3c0 said:
              did not notice that, but tried now. result:

              TypeError: Cannot read property 'DetailInformation_s' of undefined.

              I followed every single step described here

              p3c0P 1 Reply Last reply
              0
              • C CertaBit

                @p3c0 said:
                did not notice that, but tried now. result:

                TypeError: Cannot read property 'DetailInformation_s' of undefined.

                I followed every single step described here

                p3c0P Offline
                p3c0P Offline
                p3c0
                Moderators
                wrote on last edited by
                #10

                @CertaBit Does the model work ? Just to test the model assign some hard coded string to text. If the ListView shows those many amount of list items with that hard coded text it means the model works correctly and the problem is in accessing the property of individual items in that list.

                157

                C 1 Reply Last reply
                0
                • p3c0P p3c0

                  @CertaBit Does the model work ? Just to test the model assign some hard coded string to text. If the ListView shows those many amount of list items with that hard coded text it means the model works correctly and the problem is in accessing the property of individual items in that list.

                  C Offline
                  C Offline
                  CertaBit
                  wrote on last edited by
                  #11

                  @p3c0
                  good idea, tried this before posting here. this works correct, the problem is accessing the property.

                  p3c0P 1 Reply Last reply
                  0
                  • C CertaBit

                    @p3c0
                    good idea, tried this before posting here. this works correct, the problem is accessing the property.

                    p3c0P Offline
                    p3c0P Offline
                    p3c0
                    Moderators
                    wrote on last edited by
                    #12

                    @CertaBit Ok.. Can you post output of following ? Add it in Component.onCompleted handler of QML file where ListView is present.

                    Component.onCompleted: {
                        console.log(MyObject.CoatingCurrentCarrierOrders)
                        console.log("\n",MyObject.CoatingCurrentCarrierOrders[0])
                        console.log("\n",MyObject.CoatingCurrentCarrierOrders[0][0].DetailInformation_s)
                    }
                    

                    157

                    C 1 Reply Last reply
                    0
                    • p3c0P p3c0

                      @CertaBit Ok.. Can you post output of following ? Add it in Component.onCompleted handler of QML file where ListView is present.

                      Component.onCompleted: {
                          console.log(MyObject.CoatingCurrentCarrierOrders)
                          console.log("\n",MyObject.CoatingCurrentCarrierOrders[0])
                          console.log("\n",MyObject.CoatingCurrentCarrierOrders[0][0].DetailInformation_s)
                      }
                      
                      C Offline
                      C Offline
                      CertaBit
                      wrote on last edited by CertaBit
                      #13

                      @p3c0
                      Console shows:

                      qml: [true,true,true]
                      qml:
                      true

                      this points to console.log("\n",MyObject.CoatingCurrentCarrierOrders[0][0].DetailInformation_s):
                      qrc:/qml/Coating.qml:168: TypeError: Cannot read property 'DetailInformation_s' of undefined

                      seems that it handles it as bool type not DA_Order...

                      p3c0P 1 Reply Last reply
                      0
                      • C CertaBit

                        @p3c0
                        Console shows:

                        qml: [true,true,true]
                        qml:
                        true

                        this points to console.log("\n",MyObject.CoatingCurrentCarrierOrders[0][0].DetailInformation_s):
                        qrc:/qml/Coating.qml:168: TypeError: Cannot read property 'DetailInformation_s' of undefined

                        seems that it handles it as bool type not DA_Order...

                        p3c0P Offline
                        p3c0P Offline
                        p3c0
                        Moderators
                        wrote on last edited by
                        #14

                        @CertaBit Try using QVariant::fromValue instead of QVariant()
                        Tried simulating your problem. Try the following code. It should explain what I meant:
                        myItem.h

                        #ifndef MYITEM_H
                        #define MYITEM_H
                        
                        #include <QObject>
                        
                        class MyItem : public QObject
                        {
                            Q_OBJECT
                            Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
                        public:
                            explicit MyItem(QObject *parent = 0);
                            QString name() const;
                        
                        protected slots:
                            void setName(QString name);
                        
                        signals:
                            void nameChanged(QString arg);
                        
                        private:
                            QString m_name;
                        };
                        
                        #endif // MYITEM_H
                        

                        myitem.cpp

                        #include "myitem.h"
                        
                        MyItem::MyItem(QObject *parent) : QObject(parent)
                        {}
                        
                        void MyItem::setName(QString name)
                        {
                            m_name = name;
                        }
                        
                        QString MyItem::name() const
                        {
                            return m_name;
                        }
                        

                        myobject.h

                        #ifndef MYOBJECT_H
                        #define MYOBJECT_H
                        
                        #include <QObject>
                        #include <QVariantList>
                        #include "myitem.h"
                        
                        class MyObject : public QObject
                        {
                            Q_OBJECT
                            Q_PROPERTY(QVariantList list READ list WRITE setList NOTIFY listChanged)
                        
                        public:
                            explicit MyObject(QObject *parent = 0);
                            QVariantList list() const;
                        
                        signals:
                            void listChanged(QVariantList arg);
                        
                        public slots:
                            void setList(QVariantList arg);
                        
                        private:
                            QVariantList m_list;
                        };
                        
                        #endif // MYOBJECT_H
                        
                        

                        myobject.cpp

                        #include "myobject.h"
                        
                        MyObject::MyObject(QObject *parent) : QObject(parent)
                        {
                             QVariantList tmpList1;
                             for(int a=0;a<10;a++) {
                                 MyItem *i = new MyItem;
                                 i->setProperty("name","Item-A-"+QString::number(a));
                                 tmpList1 << QVariant::fromValue(i);
                             }
                        
                             m_list.append(QVariant::fromValue(tmpList1));
                        
                             QVariantList tmpList2;
                             for(int b=0;b<10;b++) {
                                 MyItem *i = new MyItem;
                                 i->setProperty("name","Item-B-"+QString::number(b));
                                 tmpList2 << QVariant::fromValue(i);
                             }
                        
                             m_list.append(QVariant::fromValue(tmpList2));
                        }
                        
                        QVariantList MyObject::list() const
                        {
                            return m_list;
                        }
                        
                        void MyObject::setList(QVariantList arg)
                        {
                            if (m_list == arg)
                                return;
                        
                            m_list = arg;
                            emit listChanged(arg);
                        }
                        

                        main.cpp

                        #include <QGuiApplication>
                        #include <QQmlApplicationEngine>
                        #include <QtQuick>
                        #include "myobject.h"
                        
                        
                        int main(int argc, char *argv[])
                        {
                            QGuiApplication app(argc, argv);
                        
                            MyObject obj;
                            QQmlApplicationEngine engine;
                            engine.rootContext()->setContextProperty("MyObject",&obj);
                            engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
                        
                            return app.exec();
                        }
                        

                        main.qml

                        import QtQuick 2.4
                        import QtQuick.Window 2.2
                        import QtQuick.Controls 1.3
                        
                        Window {
                            visible: true
                            width: 200
                            height: 400
                        
                            ListView {
                                anchors.fill: parent
                                model: MyObject.list[0]
                        
                                delegate: Rectangle {
                                    width: 200
                                    height: 40
                                    Text {
                                        anchors.centerIn: parent
                                        text: MyObject.list[0][index].name
                                    }
                                }
                            }
                        
                            Component.onCompleted: {
                                console.log(MyObject.list)
                                console.log("\n",MyObject.list[0])
                                console.log("\n",MyObject.list[0][0].name)
                            }
                        }
                        
                        

                        157

                        C 1 Reply Last reply
                        0
                        • p3c0P p3c0

                          @CertaBit Try using QVariant::fromValue instead of QVariant()
                          Tried simulating your problem. Try the following code. It should explain what I meant:
                          myItem.h

                          #ifndef MYITEM_H
                          #define MYITEM_H
                          
                          #include <QObject>
                          
                          class MyItem : public QObject
                          {
                              Q_OBJECT
                              Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
                          public:
                              explicit MyItem(QObject *parent = 0);
                              QString name() const;
                          
                          protected slots:
                              void setName(QString name);
                          
                          signals:
                              void nameChanged(QString arg);
                          
                          private:
                              QString m_name;
                          };
                          
                          #endif // MYITEM_H
                          

                          myitem.cpp

                          #include "myitem.h"
                          
                          MyItem::MyItem(QObject *parent) : QObject(parent)
                          {}
                          
                          void MyItem::setName(QString name)
                          {
                              m_name = name;
                          }
                          
                          QString MyItem::name() const
                          {
                              return m_name;
                          }
                          

                          myobject.h

                          #ifndef MYOBJECT_H
                          #define MYOBJECT_H
                          
                          #include <QObject>
                          #include <QVariantList>
                          #include "myitem.h"
                          
                          class MyObject : public QObject
                          {
                              Q_OBJECT
                              Q_PROPERTY(QVariantList list READ list WRITE setList NOTIFY listChanged)
                          
                          public:
                              explicit MyObject(QObject *parent = 0);
                              QVariantList list() const;
                          
                          signals:
                              void listChanged(QVariantList arg);
                          
                          public slots:
                              void setList(QVariantList arg);
                          
                          private:
                              QVariantList m_list;
                          };
                          
                          #endif // MYOBJECT_H
                          
                          

                          myobject.cpp

                          #include "myobject.h"
                          
                          MyObject::MyObject(QObject *parent) : QObject(parent)
                          {
                               QVariantList tmpList1;
                               for(int a=0;a<10;a++) {
                                   MyItem *i = new MyItem;
                                   i->setProperty("name","Item-A-"+QString::number(a));
                                   tmpList1 << QVariant::fromValue(i);
                               }
                          
                               m_list.append(QVariant::fromValue(tmpList1));
                          
                               QVariantList tmpList2;
                               for(int b=0;b<10;b++) {
                                   MyItem *i = new MyItem;
                                   i->setProperty("name","Item-B-"+QString::number(b));
                                   tmpList2 << QVariant::fromValue(i);
                               }
                          
                               m_list.append(QVariant::fromValue(tmpList2));
                          }
                          
                          QVariantList MyObject::list() const
                          {
                              return m_list;
                          }
                          
                          void MyObject::setList(QVariantList arg)
                          {
                              if (m_list == arg)
                                  return;
                          
                              m_list = arg;
                              emit listChanged(arg);
                          }
                          

                          main.cpp

                          #include <QGuiApplication>
                          #include <QQmlApplicationEngine>
                          #include <QtQuick>
                          #include "myobject.h"
                          
                          
                          int main(int argc, char *argv[])
                          {
                              QGuiApplication app(argc, argv);
                          
                              MyObject obj;
                              QQmlApplicationEngine engine;
                              engine.rootContext()->setContextProperty("MyObject",&obj);
                              engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
                          
                              return app.exec();
                          }
                          

                          main.qml

                          import QtQuick 2.4
                          import QtQuick.Window 2.2
                          import QtQuick.Controls 1.3
                          
                          Window {
                              visible: true
                              width: 200
                              height: 400
                          
                              ListView {
                                  anchors.fill: parent
                                  model: MyObject.list[0]
                          
                                  delegate: Rectangle {
                                      width: 200
                                      height: 40
                                      Text {
                                          anchors.centerIn: parent
                                          text: MyObject.list[0][index].name
                                      }
                                  }
                              }
                          
                              Component.onCompleted: {
                                  console.log(MyObject.list)
                                  console.log("\n",MyObject.list[0])
                                  console.log("\n",MyObject.list[0][0].name)
                              }
                          }
                          
                          
                          C Offline
                          C Offline
                          CertaBit
                          wrote on last edited by
                          #15

                          @p3c0 said:
                          YES!!!! THIS IS IT!!! Thank's man!

                          This is what did the job:

                          myObject.cpp:
                          tmpList << QVariant::fromValue(myOrders_t.peekNext());

                          QML:

                          model: myObject.CoatingCurrentCarrierOrders
                          
                          Text {
                             text: modelData.DetailInformation_s
                             width: 150
                          }
                          
                          with "modelData" equal to your suggestion  
                          
                          `MyObject.list[0][index]`
                          
                          Seems that the hierarchy is model.modelData.Propertyname.
                          
                          So what actually was the issue? Qt handles added with QVariant() as boolean if its a pointer?
                          p3c0P 1 Reply Last reply
                          0
                          • C CertaBit

                            @p3c0 said:
                            YES!!!! THIS IS IT!!! Thank's man!

                            This is what did the job:

                            myObject.cpp:
                            tmpList << QVariant::fromValue(myOrders_t.peekNext());

                            QML:

                            model: myObject.CoatingCurrentCarrierOrders
                            
                            Text {
                               text: modelData.DetailInformation_s
                               width: 150
                            }
                            
                            with "modelData" equal to your suggestion  
                            
                            `MyObject.list[0][index]`
                            
                            Seems that the hierarchy is model.modelData.Propertyname.
                            
                            So what actually was the issue? Qt handles added with QVariant() as boolean if its a pointer?
                            p3c0P Offline
                            p3c0P Offline
                            p3c0
                            Moderators
                            wrote on last edited by
                            #16

                            @CertaBit Well, use QVariant::fromValue() to construct variants from the pointer types as mentioned here. Not sure why it returned true though.

                            157

                            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