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. Models: QList<QObject*> vs QList<Derived*>
Forum Updated to NodeBB v4.3 + New Features

Models: QList<QObject*> vs QList<Derived*>

Scheduled Pinned Locked Moved QML and Qt Quick
17 Posts 3 Posters 5.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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #8

    Indeed, I've mixed two different things together. Sorry

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • Q Offline
      Q Offline
      qragnar
      wrote on last edited by
      #9

      [quote author="Ildar" date="1410240434"]Also, you may using "QQmlListProperty":http://qt-project.org/doc/qt-5/qqmllistproperty.html[/quote]

      I'm not really sure I understand how this applies to a model. Are you suggesting I simply wrap the QList as a property of a model?

      1 Reply Last reply
      0
      • I Offline
        I Offline
        Ildar
        wrote on last edited by
        #10

        Yes, you may create simple wrap for QList<Derived*>
        I think QQmlListProperty more appropriate way to set collection from C++ to QML. For example:
        @Q_PROPERTY(QQmlListProperty<Derived> derivedList READ derivedListProperty NOTIFY derivedListChanged)

        private:
        QQmlListProperty<Derived> derivedListProperty()
        {
        return QQmlListProperty<Derived>(this,
        NULL,
        &MyClass::append,
        &MyClass::count,
        &MyClass::at,
        &MyClass::clear);
        }

        static void append(QQmlListProperty<Derived> *property, Derived *value)
        {
        MyClass myClass = qobject_cast<MyClass>(property->object);

        if(myClass != NULL)
        {
                myClass->add(value);
        }
        

        }

        static Derived *at(QQmlListProperty<Derivedt> *property, int index)
        {
        MyClacc myClass = qobject_cast<MyClass>(property->object);

        if(myClass != NULL)
        {
            return myClass->at(index);
        }
        else
        {
            return NULL;
        }
        

        }

        static void clear(QQmlListProperty<Derived> *property)
        {
        MyClass myClass = qobject_cast<MyClass>(property->object);

        if(myClass != NULL)
        {
            myClass->clear();
        }
        

        }

        static int count(QQmlListProperty<Derived> *property)
        {
        MyClass myClass = qobject_cast<MyClass>(property->object);

        if(myClass != NULL)
        {
            return myClass->size();
        }
        else
        {
            return 0;
        }
        

        }
        @

        And now in QML you can using myClass.derivedList as simple QML list

        1 Reply Last reply
        0
        • Q Offline
          Q Offline
          qragnar
          wrote on last edited by
          #11

          Hmm... Still not sure I'm getting this. I tried your code. Thank you very much for that, btw! However, the GridView doesn't get populated with anything:

          @GridView {
          id: buttonGrid
          anchors.fill: parent
          model: MyClass.derivedList
          // ...
          }@

          buttonGrid is empty. I've inserted some qDebug() calls and it seems that derivedListProperty() does not even get called...

          1 Reply Last reply
          0
          • I Offline
            I Offline
            Ildar
            wrote on last edited by
            #12

            Did you register your custom type?
            @qmlRegisterType<MyClass>("MyApp", 1,0, "MyClass");@

            And did you export MyClass instance to QML?
            @
            QQmlApplicationEngine *qmlEngine = new QQmlApplicationEngine(this);
            qmlEngine->rootContext()->setContextProperty("myClass", new MyClass());
            @
            Or did you create MyClass instance in QML?
            @
            MyClass {
            id: myClass
            }
            GridView {
            id: buttonGrid
            anchors.fill: parent
            model: myClass.derivedList
            // ...
            }@

            1 Reply Last reply
            0
            • Q Offline
              Q Offline
              qragnar
              wrote on last edited by
              #13

              Yes, I have registered the type using qmlRegisterType. And main.cpp contains the following:

              @QGuiApplication *app = SailfishApp::application(argc, argv);
              QQuickView *view = SailfishApp::createView();
              QQmlContext *ctxt = view->rootContext();
              
              MyClass mc;
              // this is irrelevant here, but included for clarity
              // it is just to make it possible for mc to use setContectProperty
              // in this case, it isn't used, though
              mc.setQmlContext(ctxt);
              mc.loadData("default");
              view->setResizeMode(QQuickView::SizeRootObjectToView);
              ctxt->setContextProperty("MyClass", QVariant::fromValue(&mc));
              

              @

              As you can see, this is really a SailFish app

              1 Reply Last reply
              0
              • I Offline
                I Offline
                Ildar
                wrote on last edited by
                #14

                Try ctxt->setContextProperty("myClass", QVariant::fromValue(&mc));
                and using as model: myClass.derivedList (start with lower letter "m").
                P.S.
                MyClass - this is type
                myClass - this is instance of object

                1 Reply Last reply
                0
                • I Offline
                  I Offline
                  Ildar
                  wrote on last edited by
                  #15

                  And more better set parents to objects. For example:
                  @MyClass *myClass = new MyClass(this);@
                  This is because if object parent is null than QML take ownership of object.

                  1 Reply Last reply
                  0
                  • Q Offline
                    Q Offline
                    qragnar
                    wrote on last edited by
                    #16

                    Well, to be precise the type could start with a lower case and the instance name with an upper case, but I suppose using the same name for both could be more problematic.

                    In any case, it is now working and I can set the model to derivedList. Thanks very much for that suggestion. However, I still have my original problem, which is the reason wanting to use something other than QList<QObject*>. The original problem is that I can't called a method defined in Derived from the Delegate, since QML doesn't know that model is Derived, only QObject.

                    Update:
                    Actuallly, I realised after posting this that I can dereference like this:

                    @onClicked: {
                    myClass.derivedList[index].doSomeStuff()
                    myClass.derivedList[index].callAnotherMethod()
                    }
                    @

                    So my original issue is actually solved now. Thanks!

                    1 Reply Last reply
                    0
                    • I Offline
                      I Offline
                      Ildar
                      wrote on last edited by
                      #17

                      bq. Well, to be precise the type could start with a lower case and the instance name with an upper case, but I suppose using the same name for both could be more problematic.

                      Of cource) Simply, I using "Qt coding style":http://qt-project.org/wiki/Qt_Coding_Style

                      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