SetMainQmlFile`, rootObject and showExpanded are not members of QQmlApplicationEngine

I wrote this piece of code following the guidance of some guys, but I can't get it to work. The error says:

setMainQmlFile`, rootObject and showExpanded are not members of QQmlApplicationEngine

What he should do is get a signal from QML and print a message (in the console). I am mainly trying to integrate C ++ and QML.

EDIT

I tried to replace some functions with some others that seemed appropriate (at least for me). I also tried to find out what to enable so that these functions worked, but no luck.

#include <QGuiApplication> #include <QQmlApplicationEngine> #include "qtquickglobal.h" #include <QQmlContext> #include "myclass.h" #include <QtCore> #include <QtDebug> #include <QQuickWindow> int main(int argc, char *argv[]){ //Q_OBJECT; QGuiApplication app(argc, argv); QQmlApplicationEngine viewer; viewer.load(QUrl(QStringLiteral("Qt/Versuch2/main.qml"))); myclass data; viewer.rootContext() ->setContextProperty("myclassData", &data); viewer.setMainQmlFile(QStringLiteral("qml/Versuch2/main.qml")); QObject *viewerobject = viewer.rootObject(); QObject::connect(viewerobject, SIGNAL(qmlSignal(QString)), &data, SLOT(cppSlot(QString))); viewer.showExpanded(); return app.exec(); } void myclass::cppSlot(QString msg) { qDebug() <<QString ("Called the cpp slot with message: %1").arg(msg); } 

Thanks.

0
source share
2 answers

I don’t know where you found the tutorial, but regarding the Qt documentation there are no methods like setMainQmlFile and showExpanded for QQmlApplicationEngine .

For setMainQmlFile(...) try using setSource(...) instead.

For showExpanded() , the QWidget function and QQmlApplicationEngine do not inherit QWidget .

As for rootObject() , it could be a typo, you can use rootObjects() which return a QList<QObject*> .

Change It looks like you will need to use the Qt Quick 2 Application Qt Creator wizard to recreate this QtQuick2ApplicationViewer class used in the tutorial you found.

0
source

Using Qt 5.4.0 and Qt Creator 3.3.0, create a new project:

  • Click "New Project"
  • Qt quick app
  • Click "Select ..."
  • Name the project and choose where to place it.
  • Click "Next"
  • Select Qt Quick 2.4 from the drop-down menu
  • Click "Next"
  • Select the desired kit (s)
  • Click "Next"
  • Click Finish

You should now see the open main.qml file with the following code:

 import QtQuick 2.4 import QtQuick.Window 2.2 Window { visible: true MainForm { anchors.fill: parent mouseArea.onClicked: { Qt.quit(); } } } 

Make changes to the file so that it looks like this:

 import QtQuick 2.4 import QtQuick.Window 2.2 Window { visible: true //### New Code ### signal myQmlSignal(string msg) //################ MainForm { anchors.fill: parent mouseArea.onClicked: { //### New Code ### //Replace "Qt.quit();" with console.log("Sending myQmlSignal from QML..."); myQmlSignal("Hello from QML") //################ } } } 

Add a new class to your project:

  • Right mouse Click project name in the project view
  • Click Add New ...
  • Select C ++ class if not already selected
  • Click "Select ..."
  • In the Class Name field, enter "MyCppClass"
  • Set base class in QObject
  • Click "Next"
  • Click Finish

Open the mycppclass.h file, it should look like this:

 #ifndef MYCPPCLASS_H #define MYCPPCLASS_H #include <QObject> class MyCppClass : public QObject { Q_OBJECT public: explicit MyCppClass(QObject *parent = 0); ~MyCppClass(); signals: public slots: }; #endif // MYCPPCLASS_H 

Make changes to mycppclass.h so it looks like this:

 #ifndef MYCPPCLASS_H #define MYCPPCLASS_H #include <QObject> //### New Code ### #include <QDebug> //################ class MyCppClass : public QObject { Q_OBJECT public: explicit MyCppClass(QObject *parent = 0); ~MyCppClass(); signals: public slots: //### New Code ### void myCppSlot(const QString &msg); //################ }; #endif // MYCPPCLASS_H 

Open mycppclass.cpp, which should look like this:

 #include "mycppclass.h" MyCppClass::MyCppClass(QObject *parent) : QObject(parent) { } MyCppClass::~MyCppClass() { } 

Change it like this:

 #include "mycppclass.h" MyCppClass::MyCppClass(QObject *parent) : QObject(parent) { } MyCppClass::~MyCppClass() { } void MyCppClass::myCppSlot(const QString &msg) { //### New Code ### qDebug() << "Signal was received by C++. It contains follwoing message: " << msg; //################ } 

Open main.cpp, which looks like this:

 #include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } 

And make the following changes:

 #include <QGuiApplication> #include <QQmlApplicationEngine> //### New Code ### #include "mycppclass.h" //################ int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //### New Code ### MyCppClass myCppClass; QObject::connect(engine.rootObjects().takeFirst(), SIGNAL(myQmlSignal(QString)), &myCppClass, SLOT(myCppSlot(QString))); //################ return app.exec(); } 

Click the big green triangle to compile and run the application. Look at the application output area, click "Hello World", you will see the following message:

qml: sending myQmlSignal from QML ...

The signal was received by C ++. It contains the following message: "Hello from QML"

0
source

Source: https://habr.com/ru/post/979548/


All Articles