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. C++ to change QML object properties
Forum Updated to NodeBB v4.3 + New Features

C++ to change QML object properties

Scheduled Pinned Locked Moved QML and Qt Quick
57 Posts 4 Posters 44.4k 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.
  • V Offline
    V Offline
    Vignes
    wrote on last edited by
    #9

    Hi,
    I tried to change QML Window to fullscreen using visibility via c++
    @
    QQuickWindow *W = (QQuickWindow *)engine.rootObjects().first();
    if (W)
    W->setProperty("visibility", "Fullscreen");
    @
    tried
    @
    W->FullScreen;
    @
    tried
    @
    W->visibility() = "Fullscreen";
    @

    none of them are working. Help please?

    1 Reply Last reply
    0
    • V Offline
      V Offline
      Vignes
      wrote on last edited by
      #10

      Hi,
      I got it working, it the spelling of the Fullscreen should be "FullScreen"
      @
      QQuickWindow *W = (QQuickWindow *)engine.rootObjects().first();
      if (W)
      W->setProperty("visibility", "FullScreen");
      @

      1 Reply Last reply
      0
      • p3c0P Offline
        p3c0P Offline
        p3c0
        Moderators
        wrote on last edited by
        #11

        For FullScreen you can use directly,

        @
        if (W)
        W->showFullScreen();
        @

        157

        1 Reply Last reply
        0
        • V Offline
          V Offline
          Vignes
          wrote on last edited by
          #12

          Hi,
          I have objects window, text and mouse area to text in qml document and I want to implement in c++: when text area is clicked: if the window is not on fullscreen, it should become fullscreen and the text in the text are should change to "Window is Fullscreen" with a animated color chage to "white". Next time it clicked it should come out of fullscreen and chanege the text and color. Also console.log equivalent output of the this event along with screen resolution should be output from c++ (not via qml).

          main.qml :
          @
          import QtQuick 2.2
          import QtQuick.Window 2.1

          Window {
          id: window1
          visible: true
          width: 360
          height: 360
          color: "red"
          title: "MyWindow"

          Text {
              objectName: "myText"
              text: qsTr("Hello World!<br><i>I'm </i><b>not Fullscreen<i> Now</i></b>")
              font.bold: true
              horizontalAlignment: Text.AlignHCenter
              font.family: "Times New Roman"
              font.pointSize: 18
              anchors.centerIn: parent
              color: "steelblue"
          
              MouseArea {
                  anchors.fill: parent
              }
          }
          

          }
          @

          main.cpp
          @
          #include <QGuiApplication>
          #include <QQmlApplicationEngine>
          #include <QtQuick/QQuickItem>
          #include <QtQuick/QQuickWindow>

          int main(int argc, char *argv[])
          {
          QGuiApplication app(argc, argv);

          QQmlApplicationEngine engine;
          engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
          

          //here I need function for
          //1 clicke event
          //check fullscreen value
          //2 text changing
          //3 animation
          //4 console.log output of Screen resolution and action
          //5 finaly Window : showMaximized(); or showFullScreen();

          return app.exec();
          

          }
          @

          Could you help me with this please?
          Thank you

          1 Reply Last reply
          0
          • p3c0P Offline
            p3c0P Offline
            p3c0
            Moderators
            wrote on last edited by
            #13

            You can,

            1. Create a QObject based class
            2. Create a SLOT in it
            3. Pass QQuickWindow pointer (which we obtained as shown above) to it
            4. Create a signal in your QML
            5. Do the connections
            6. In the created class cast the QObject pointer to QQuickWindow using qobject_cast
            7. Use this pointer to access/modify the properties of the QML window in the SLOT when the SIGNAL is fired from QML

            157

            1 Reply Last reply
            0
            • V Offline
              V Offline
              Vignes
              wrote on last edited by
              #14

              Hi,
              I created QObject: called iobject.h
              @
              #ifndef IOBJECT_H
              #define IOBJECT_H

              #include <QObject>

              class iObject : public QObject
              {
              Q_OBJECT
              Q_PROPERTY(QString name READ name WRITE setName)
              public:
              explicit iObject(QObject *parent = 0);

              QString name() const;
              
                  Q_INVOKABLE void nameChang();
              

              signals:
              void nameChanged(int newValue);

              public slots:
              void setName(const QString &name);

              private:
              QString m_name;
              };

              #endif // IOBJECT_H
              @

              iobject.cpp
              @
              #include "iobject.h"

              iObject::iObject(QObject *parent) :
              QObject(parent)
              {
              }
              QString iObject::name() const
              {
              return m_name;
              }
              iObject::setName(const QString &name){
              if(name != m_name)
              m_name = name;
              emit nameChanged(name);
              }
              @

              main.cpp
              @
              #include "iobject.h"
              #include <QGuiApplication>
              #include <QQmlApplicationEngine>

              int main(int argc, char *argv[])
              {
              QGuiApplication app(argc, argv);

              qmlRegisterType<iObject>("myObject", 1, 0, "iObject");
              
              QQmlApplicationEngine engine;
              engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
              
              return app.exec();
              

              }
              @

              main.qml
              @
              import QtQuick 2.2
              import QtQuick.Window 2.1
              import myObject 1.0

              Window {
              visible: true
              width: 360
              height: 360
              title: iObject.name

              MouseArea {
                  anchors.fill: parent
                  onClicked: {
                      Qt.quit();
                  }
              }
              
              Text {
                  text: qsTr("Hello World!<br><i>I'm </i><b>not Fullscreen<i> Now</i></b>")
                  horizontalAlignment: Text.AlignHCenter
                  font.family: "Times New Roman"
                  font.pointSize: 18
                  anchors.centerIn: parent
                  color: "steelblue"
              
                  MouseArea {
                      anchors.fill: parent
                  }
              }
              

              }
              @

              At this point, It did not work. erros on main.cpp 'qmlRegisterType'
              what am I doing wrong?

              1 Reply Last reply
              0
              • p3c0P Offline
                p3c0P Offline
                p3c0
                Moderators
                wrote on last edited by
                #15

                Just create a the class and pass the QQuickWindow pointer. No need use qmlRegisterType.
                Something like this,
                main.cpp
                @
                QQmlApplicationEngine engine;
                engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
                QQuickWindow *W = (QQuickWindow *)engine.rootObjects().first();
                iObject a(W);
                QObject::connect(engine.rootObjects().first(),SIGNAL(callCpp()),&a,SLOT(onCallCpp()));
                @

                No need of custom properties in the class.
                Remember to cast back QObject back to QQuickWindow in iObject and then you can modify QQuickWindow properties as shown earlier.

                157

                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  Vignes
                  wrote on last edited by
                  #16

                  I'm getting error "main.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl iObject::iObject(class QObject *)" (??0iObject@@QEAA@PEAVQObject@@@Z) referenced in function main"

                  1 Reply Last reply
                  0
                  • p3c0P Offline
                    p3c0P Offline
                    p3c0
                    Moderators
                    wrote on last edited by
                    #17

                    Have you included its corresponding header file (probably iobject.h) in main.cpp ?

                    157

                    1 Reply Last reply
                    0
                    • V Offline
                      V Offline
                      Vignes
                      wrote on last edited by
                      #18

                      Yes
                      main.cpp
                      @
                      #include "iobject.h"
                      #include <QGuiApplication>
                      #include <QQmlApplicationEngine>
                      #include <QtQuick/QQuickWindow>

                      int main(int argc, char *argv[])
                      {
                      QGuiApplication app(argc, argv);

                      QQmlApplicationEngine engine;
                      engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
                      
                      QQuickWindow *W = (QQuickWindow *)engine.rootObjects().first();
                      iObject a(W);
                      QObject::connect(engine.rootObjects().first(),SIGNAL(callCpp()),&a,SLOT(onCallCpp()));
                      
                      return app.exec();
                      

                      }
                      @

                      1 Reply Last reply
                      0
                      • p3c0P Offline
                        p3c0P Offline
                        p3c0
                        Moderators
                        wrote on last edited by
                        #19

                        Can you post the new iobject.cpp and .h file ?

                        157

                        1 Reply Last reply
                        0
                        • V Offline
                          V Offline
                          Vignes
                          wrote on last edited by
                          #20

                          iobject.h
                          @
                          #ifndef IOBJECT_H
                          #define IOBJECT_H

                          #include <QObject>

                          class iObject : public QObject
                          {
                          Q_OBJECT
                          public:
                          explicit iObject(QObject *parent = 0);

                          signals:

                          public slots:

                          };

                          #endif // IOBJECT_H
                          @

                          iobject.cpp
                          @
                          #include "iobject.h"

                          iObject::iObject(QObject *parent) :
                          QObject(parent)
                          {
                          }
                          @

                          1 Reply Last reply
                          0
                          • p3c0P Offline
                            p3c0P Offline
                            p3c0
                            Moderators
                            wrote on last edited by
                            #21

                            Everything seems to be fine to me.
                            Try to clean, run qmake and build the project again.
                            Apart from that declare the SLOT onCallCpp in iObject class.

                            157

                            1 Reply Last reply
                            0
                            • V Offline
                              V Offline
                              Vignes
                              wrote on last edited by
                              #22

                              Still same error, the
                              @
                              iObject a(W);
                              @

                              Creates following errors:
                              "main.obj:-1: error: LNK2019: unresolved external symbol "public: _cdecl iObject::iObject(class QObject *)" (??0iObject@@QEAA@PEAVQObject@@@Z) referenced in function main""
                              And
                              "debug\HEVC
                              .exe:-1: error: LNK1120: 1 unresolved externals
                              "
                              I tried cleaning and rebuild it and created a new project and tried it, same error

                              All the code in new project follows:
                              main.qml
                              @
                              import QtQuick 2.2
                              import QtQuick.Window 2.1

                              Window {
                              visible: true
                              width: 360
                              height: 360

                              MouseArea {
                                  anchors.fill: parent
                                  onClicked: {
                                      Qt.quit();
                                  }
                              }
                              
                              Text {
                                  text: qsTr("Hello World")
                                  anchors.centerIn: parent
                              }
                              

                              }
                              @

                              main.cpp
                              @
                              #include <QGuiApplication>
                              #include <QQmlApplicationEngine>
                              #include <QtQuick/QQuickWindow>
                              #include "iobject.h"

                              int main(int argc, char *argv[])
                              {
                              QGuiApplication app(argc, argv);

                              QQmlApplicationEngine engine;
                              engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
                              QQuickWindow *W = (QQuickWindow *)engine.rootObjects().first();
                                  iObject a(W);
                                  QObject::connect(engine.rootObjects().first(),SIGNAL(callCpp()),&a,SLOT(onCallCpp()));
                              
                              return app.exec();
                              

                              }
                              @

                              iobject.h
                              @
                              #ifndef IOBJECT_H
                              #define IOBJECT_H

                              #include <QObject>

                              class iObject : public QObject
                              {
                              Q_OBJECT
                              public:
                              explicit iObject(QObject *parent = 0);

                              signals:

                              public slots:
                              void onCallCpp();

                              };

                              #endif // IOBJECT_H
                              @

                              iobject.cpp
                              @
                              #include "iobject.h"

                              iObject::iObject(QObject *parent) :
                              QObject(parent)
                              {
                              }
                              @

                              I went though several examples and foud ""Animated Tiles":http://qt-project.org/doc/qt-4.8/animation-animatedtiles.html" example. This one uses different library like QtWidgets, QtCore/qstate.h and main.moc. here not QML. This is an old version qt-4.8 as well.

                              I'm now wondering, that am I using the right QT tool for my project, which uses 4K video playing, editing, analytics tools with the support of OpenGL to be implimented using Cpp.

                              I chose QML, because of built in OpenGL, and Cpp and JS support. Now Qt Widgets, Qt Quick Application, Qt Quick UI and old version, new version are confusion to me.

                              It would be great, If you could please help me with these.

                              Thank you

                              1 Reply Last reply
                              0
                              • p3c0P Offline
                                p3c0P Offline
                                p3c0
                                Moderators
                                wrote on last edited by
                                #23

                                Have the files iobject.cpp and .h included in the project structure from Qt Creator?
                                I have created a small test app based upon the example.
                                Here's the "Link":https://docs.google.com/file/d/0B3rkZH6q1E7ocTdnOFQwNVBDM2c/edit?pli=1
                                Please check if it works.

                                Also Animated Tiles is a completely different example. It doesnot use Qt Quick.
                                Please do not go over to Qt 4.8 or less. It's lot different from Qt 5.3

                                You can refer Qt 5 docs for more information.
                                Following are good links
                                "http://qt-project.org/doc/qt-5/qtqml-index.html":http://qt-project.org/doc/qt-5/qtqml-index.html
                                "http://qt-project.org/doc/qt-5/qtqml-cppintegration-topic.html":http://qt-project.org/doc/qt-5/qtqml-cppintegration-topic.html

                                Let me know if the Sample Application works.

                                157

                                1 Reply Last reply
                                0
                                • V Offline
                                  V Offline
                                  Vignes
                                  wrote on last edited by
                                  #24

                                  Thanks, your sample works. I got main working after deleting the build folder. Some reason cleaning didn't work, even when I copy and pasted your code.

                                  I was thinking like this, creating object and connecting it to QML types:
                                  iObject A
                                  A.screenSize (connect to Window : visibility)
                                  A.textApped (connect to Text : text)
                                  A.animantionStart (connect to Animation : start)

                                  Then changing it in cpp and then emitting signal or even creating, changing & destroying QML types in cpp. Like JavaScript in HTML application.

                                  If you can provide this type of sample works on would be very grateful.

                                  *Note: I learn using simple working example rather than reading text with pieces of code, because of my DYSLEXIA.

                                  1 Reply Last reply
                                  0
                                  • p3c0P Offline
                                    p3c0P Offline
                                    p3c0
                                    Moderators
                                    wrote on last edited by
                                    #25

                                    You can also use "QMetaObject::invokeMethod":http://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod to call a javascript function inside a QML and in that function you can do the operations.
                                    For eg.
                                    Test.qml
                                    @
                                    Window {
                                    visible: true
                                    width: 400
                                    height: 400

                                    function changeColor() {
                                        rect.color="blue"
                                    }
                                    
                                    Rectangle {
                                        id: rect
                                        anchors.fill: parent
                                        color: "red"
                                    }
                                    

                                    }
                                    @

                                    and to call it from main.cpp

                                    @
                                    QMetaObject::invokeMethod(engine.rootObjects().first(), "changeColor");
                                    @

                                    You can also keep these calls in separate cpp methods of the iObject class.

                                    157

                                    1 Reply Last reply
                                    0
                                    • V Offline
                                      V Offline
                                      Vignes
                                      wrote on last edited by
                                      #26

                                      Say I have following main.qml
                                      @
                                      Window {
                                      visible: true
                                      width: 400
                                      height: 400

                                      Rectangle {
                                      id: rect
                                      anchors.fill: parent
                                      color: "red"
                                      
                                          Text {
                                          id: mytext
                                          text: qsTr("<b>Hello World!</b>")
                                          color: "blue"
                                          }
                                          MouseArea {
                                          anchors.fill: parent
                                          onClicked: {
                                              Qt.quit();}
                                          }
                                      }
                                      

                                      }
                                      @

                                      How do I use this "const char * QMetaObject::className() const" to get Text object name.

                                      How do I use "QMetaProperty::write(QObject * object, const QVariant & value) const" to change text value

                                      Thank you

                                      1 Reply Last reply
                                      0
                                      • p3c0P Offline
                                        p3c0P Offline
                                        p3c0
                                        Moderators
                                        wrote on last edited by
                                        #27

                                        bq. How do I use this “const char * QMetaObject::className() const” to get Text object name.

                                        As shown earlier you can find the exact Item using findChild and then use "metaObject()":http://qt-project.org/doc/qt-5/qobject.html#metaObject to get it's corresponding metaObject and then use it to get "className()":http://qt-project.org/doc/qt-5/qmetaobject.html#className;

                                        bq. How do I use “QMetaProperty::write(QObject * object, const QVariant & value) const” to change text value

                                        This kind of bit tedious, you have to first findChild then get it's metaObject and then iterate over it to find the exact index of the "property":http://qt-project.org/doc/qt-5/qmetaobject.html#property which you want to set and then change the property for that particular index using "write":http://qt-project.org/doc/qt-5/qmetaproperty.html#write

                                        Alternatively you use more user friendly "setProperty":http://qt-project.org/doc/qt-5/qobject.html#setProperty to directly set it instead of first iterating,finding and then changing.

                                        157

                                        1 Reply Last reply
                                        0
                                        • V Offline
                                          V Offline
                                          Vignes
                                          wrote on last edited by
                                          #28

                                          how do I fix the following issue
                                          @
                                          MouseArea {
                                          id: oneClick
                                          anchors.fill: parent
                                          onClicked: opacity_1.running = true;
                                          }
                                          MouseArea {
                                          id: twoClick
                                          anchors.fill: parent
                                          onDoubleClicked: window1.callCpp()
                                          }
                                          @

                                          Thank you

                                          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