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. Calling c++ function from qml
Forum Updated to NodeBB v4.3 + New Features

Calling c++ function from qml

Scheduled Pinned Locked Moved QML and Qt Quick
25 Posts 5 Posters 27.1k 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.
  • L Offline
    L Offline
    lgeyer
    wrote on last edited by
    #16

    Are you using Qt Creator? If so, if it is just Qt Creator, which complains about the file missing, just build and run your application. The file you are trying to include is generated on-the-fly when the application is built, and it is absolutely normal that it isn't available at development time.

    !http://img208.imageshack.us/img208/766/filenotfounderror.png! This means you are fine.

    Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.

    1 Reply Last reply
    0
    • R Offline
      R Offline
      rockstar
      wrote on last edited by
      #17

      Lukas, i did as u told me....i included "main.moc"......i cleaned environment......i rebuilt the project and it is still prompting the same error on "build issues" panel ........

      1 Reply Last reply
      0
      • L Offline
        L Offline
        lgeyer
        wrote on last edited by
        #18

        Well, you then either

        • do it the way it is supposed to be done or
          [quote author="Lukas Geyer" date="1327401808"]Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.[/quote]
        • you pack and upload your current application and link it here, so I can take a look on it.
        1 Reply Last reply
        0
        • R Offline
          R Offline
          rockstar
          wrote on last edited by
          #19

          http://www.mediafire.com/?b9a9r9t6qq9aoao

          i uploaded the project.....have a look at it.....thanks in advance......

          1 Reply Last reply
          0
          • L Offline
            L Offline
            lgeyer
            wrote on last edited by
            #20

            <code>main.moc</code> is generated as expected and the project compiles fine using MinGW and MSVC2010. Be aware that you have to <code>#include "main.moc"</code> at the end of the source file (or at least after the class definition).

            I don't know what's the problem on your end.

            Is there any reason you are not just doing it as it is supposed to be done?

            [quote author="Lukas Geyer" date="1327401808"]Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.[/quote]

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

              i am using qt creator......

              actually till yesterday i was doing programs only using qml.....this is my first project using both cpp and qml ......

              i thought it was easy but it's not.......

              1 Reply Last reply
              0
              • L Offline
                L Offline
                lgeyer
                wrote on last edited by
                #22

                It actually is easy.

                Please don't get me wrong - but I have told you for the third time now how it is supposed to be done and how to circumvent the need of including generated files and I still sense that you do not even properly read what I write.
                @
                // testclass.h

                class TestClass : public QObject
                {
                Q_OBJECT

                public:
                TestClass(QObject *parent = 0);

                Q_INVOKABLE QString returnString();
                

                };

                // testclass.cpp

                TestClass::TestClass(QObject *parent) : QObject(parent)
                {
                }

                QString TestClass::returnString()
                {
                return "string";
                }

                // main.cpp

                int main(int argc, char *argv[])
                {
                QApplication application(argc, argv);

                QDeclarativeView view;
                
                view.rootContext()->setContextProperty("TestClass", new TestClass(&view));
                view.setSource(QUrl::fromLocalFile&#40;"Test.qml"&#41;);
                view.show();
                
                return application.exec&#40;&#41;;
                

                }

                // Test.qml

                import QtQuick 1.1

                Text {
                text: TestClass.returnString()
                }
                @

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  rockstar
                  wrote on last edited by
                  #23

                  thanks a ton Lukas.....it worked....

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mathiii
                    wrote on last edited by
                    #24

                    Hey guys,

                    I´m having exactly the same problem, but I think some of the Classes and Libraries have changed. The way Lukas explained this makes a lot of sense to me, but the code doesn´t work for me. I´m using Qt 5.3 with QtQuick 2.2 .
                    I would be very thankful if someone could look at my code, as I´m desperate at the moment.My goal is to write a String into an xml-file.
                    the c++function should be called from qml.

                    Thanks in advance

                    @
                    //header.h
                    class TestClass : public QObject
                    {
                    Q_OBJECT

                    public:
                    TestClass(QObject *parent = 0);

                    Q_INVOKABLE void writeXml(QString &text){ }
                    

                    };@

                    @//func.cpp

                    TestClass::TestClass(QObject *parent) : QObject(parent)
                    {
                    }

                    void TestClass::writeXml(QString text)
                    {

                            QString filename = "C:/Qt5/Tools/QtCreator/bin/CPPTEST2/example.xml";
                            QFile file&#40;filename&#41;;
                            if (file.open(QIODevice::ReadWrite)) {
                                QTextStream stream(&file);
                                stream << text << endl;
                                 }
                            file.close();
                    

                    }@

                    @
                    //main.cpp
                    {
                    QGuiApplication app(argc, argv);

                    QQmlApplicationEngine engine;
                    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
                    QQuickView *view = new QQuickView;
                    view->setSource(QUrl::fromLocalFile&#40;"qrc:///main.qml"&#41;);
                    view->show();
                    
                    return app.exec();
                    

                    }
                    @
                    @ //main.qml
                    import QtQuick 2.2
                    import QtQuick.Window 2.1

                    Window {
                    visible: true
                    width: 360
                    height: 360

                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            TestClass.writeXml("Hello World");
                        }
                    }
                    

                    }@

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      messi
                      wrote on last edited by
                      #25

                      Hi mathiii
                      this is not how it works.
                      You have to create a C++ object first.
                      Than make the object for QML visible.
                      Now you can access the object.

                      Check out the following link.
                      It describes every C++/QML interaction:
                      http://qt-project.org/wiki/Introduction_to_Qt_Quick_for_Cpp_developers#e70ea8482b12de725ec779f1bc55c92c

                      Best regards

                      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