Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Qml and qlist c++

Qml and qlist c++

Scheduled Pinned Locked Moved Mobile and Embedded
23 Posts 6 Posters 25.1k 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.
  • M Offline
    M Offline
    melghawi
    wrote on last edited by
    #14

    Ok so I tried it without the test class using the qmlRegisterSingletonType and it didn't work which is odd but I have successfully been able to expose a list of QObjects from c++ to qml. I will update this post with code examples when I have more time.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      andre07
      wrote on last edited by
      #15

      Ok thanks ;-)

      1 Reply Last reply
      0
      • M Offline
        M Offline
        melghawi
        wrote on last edited by
        #16

        Ok so this is what I've come up with. I'm sure there is a much better way of doing this without the overhead.

        StateDeviceListProvider.h

        @
        #ifndef STATEDEVICELISTPROVIDER_H
        #define STATEDEVICELISTPROVIDER_H

        #include <QObject>
        #include <QQmlListProperty>

        // Forward declarations.
        class StateDevice;

        class StateDeviceListProvider : public QObject
        {
        Q_OBJECT
        Q_PROPERTY(QQmlListProperty<StateDevice> stateDeviceList READ stateDeviceList)

        public:
        static StateDeviceListProvider* instance();
        QQmlListProperty<StateDevice> stateDeviceList();

        private:
        StateDeviceListProvider(QObject *parent = NULL);

        private:
        static StateDeviceListProvider mInstance;
        QList<StateDevice
        > mStateDeviceList;
        };

        #endif // STATEDEVICELISTPROVIDER_H
        @

        StateDeviceListProvider.cpp

        @
        #include "statedevicelistprovider.h"
        #include "statedevice.h"

        StateDeviceListProvider* StateDeviceListProvider::mInstance = NULL;

        StateDeviceListProvider::StateDeviceListProvider(QObject *parent) :
        QObject(parent)
        {

        // This is just to test this code. You will use your real list.
        mStateDeviceList << new StateDevice;
        mStateDeviceList << new StateDevice;
        mStateDeviceList << new StateDevice;
        

        }

        StateDeviceListProvider* StateDeviceListProvider::instance()
        {
        if(mInstance == NULL)
        {
        mInstance = new StateDeviceListProvider;
        }
        return mInstance;
        }

        QQmlListProperty<StateDevice> StateDeviceListProvider::stateDeviceList()
        {

        // Here you would retrieve your real list and return it.
        return QQmlListProperty<StateDevice>(this, mStateDeviceList);
        

        }
        @

        main.cpp

        @
        #include <qqml.h>
        #include <QtGui/QGuiApplication>
        #include "qtquick2applicationviewer.h"
        #include "statedevicelistprovider.h"
        #include "statedevice.h"

        static QObject* StaticDeviceListProviderCallback(QQmlEngine *engine, QJSEngine *scriptEngine)
        {
        Q_UNUSED(engine)
        Q_UNUSED(scriptEngine)

        return StateDeviceListProvider::instance();
        

        }

        int main(int argc, char *argv[])
        {
        qmlRegisterType<StateDevice>();
        qmlRegisterSingletonType<StateDeviceListProvider>(
        "MyModule", 1, 0, "StateDeviceListProvider", StaticDeviceListProviderCallback);

        QGuiApplication app(argc, argv);
        
        QtQuick2ApplicationViewer viewer;
        viewer.setMainQmlFile&#40;QStringLiteral("qml/untitled/main.qml"&#41;);
        viewer.showExpanded();
        
        return app.exec();
        

        }
        @

        main.qml

        @
        import QtQuick 2.0
        import MyModule 1.0

        Rectangle {
        width: 360
        height: 360

        // Now you have your list exposed to qml.
        property variant list: StateDeviceListProvider.stateDeviceList
        
        Component.onCompleted:
        {
            // Just testing here.
            var el0 = list[0];
            console.log(el0.number())
        }
        

        }
        @

        1 Reply Last reply
        0
        • A Offline
          A Offline
          andre07
          wrote on last edited by
          #17

          thanks!! Do you have a solution for qt 4.8?

          1 Reply Last reply
          0
          • M Offline
            M Offline
            melghawi
            wrote on last edited by
            #18

            It should be near enough to the same thing with some minor modifications (class name changes). Pre Qt5 does not support qmlRegisterSingletonType so there needs to be some modification there as well. I will give it a go and post my results when I have more time. Did my first example work for you then?

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andre07
              wrote on last edited by
              #19

              yes it works!! Great!! Thanks;-))

              1 Reply Last reply
              0
              • M Offline
                M Offline
                melghawi
                wrote on last edited by
                #20

                Ok here's an example that works with QQuick 1.0. Again, If anyone has a better way of doing this then please share.

                StateDeviceListProvider.h

                @
                #ifndef STATEDEVICELISTPROVIDER_H
                #define STATEDEVICELISTPROVIDER_H

                #include <QObject>
                #include <QDeclarativeListProperty>

                class StateDevice;

                class StateDeviceListProvider : public QObject
                {
                Q_OBJECT
                Q_PROPERTY(QDeclarativeListProperty<StateDevice> stateDeviceList READ stateDeviceList CONSTANT)

                public:
                static StateDeviceListProvider* instance();
                QDeclarativeListProperty<StateDevice> stateDeviceList();

                private:
                StateDeviceListProvider(QObject *parent = NULL);

                private:
                static StateDeviceListProvider mInstance;
                QList<StateDevice
                > mStateDeviceList;
                };

                #endif // STATEDEVICELISTPROVIDER_H
                @

                StateDeviceListProvider.cpp

                @
                #include "statedevicelistprovider.h"
                #include "statedevice.h"

                StateDeviceListProvider* StateDeviceListProvider::mInstance = NULL;

                StateDeviceListProvider::StateDeviceListProvider(QObject *parent) :
                QObject(parent)
                {

                // This is just to test this code. You will use your real list.
                mStateDeviceList << new StateDevice;
                mStateDeviceList << new StateDevice;
                mStateDeviceList << new StateDevice;
                

                }

                StateDeviceListProvider* StateDeviceListProvider::instance()
                {
                if(mInstance == NULL)
                {
                mInstance = new StateDeviceListProvider;
                }
                return mInstance;
                }

                QDeclarativeListProperty<StateDevice> StateDeviceListProvider::stateDeviceList()
                {

                // Here you would retrieve your real list and return it.
                return QDeclarativeListProperty<StateDevice>(this, mStateDeviceList);
                

                }
                @

                main.cpp

                @
                #include <QApplication>
                #include <qdeclarative.h>
                #include <QDeclarativeContext>
                #include "qmlapplicationviewer.h"
                #include "statedevicelistprovider.h"
                #include "statedevice.h"

                Q_DECL_EXPORT int main(int argc, char *argv[])
                {
                qmlRegisterType<StateDevice>();

                QScopedPointer<QApplication> app(createApplication(argc, argv));
                
                QmlApplicationViewer viewer;
                
                // Pre Qt5 does not support qmlRegisterSingletonType. So this is a work-around.
                viewer.rootContext()->setContextProperty("StateDeviceListProvider", StateDeviceListProvider::instance());
                
                viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
                viewer.setMainQmlFile&#40;QLatin1String("qml/untitledQQuick1/main.qml"&#41;);
                viewer.showExpanded();
                
                return app->exec&#40;&#41;;
                

                }
                @

                main.qml

                @
                import QtQuick 1.1

                Rectangle {
                width: 360
                height: 360

                // Now you have your list exposed to qml.
                property variant list: StateDeviceListProvider.stateDeviceList
                
                Component.onCompleted:
                {
                    // Just testing here.
                    var el0 = list[0];
                    console.log(el0.number)
                }
                

                }
                @

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  reeker
                  wrote on last edited by
                  #21

                  Hi,

                  Can you post StateDevice class.

                  Because i get 'staticMetaObject' is not a member of 'StateDevice' error and i didnot find any solution.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    melghawi
                    wrote on last edited by
                    #22

                    Hi,

                    The StateDevice class was not my own class. I was helping someone expose a list from C++ to Qml. However, you can find the full class on the first page of this post where andre07 defines it.

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      baxtyar
                      wrote on last edited by
                      #23

                      visual basic and c++ are the best pc programs that ..........

                      http://www.soran.edu.iq

                      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