setMainQmlFile`, rootObject and showExpanded are not members of QQmlApplicationEngine

社会主义新天地 提交于 2019-12-13 07:35:12

问题


I've written this piece of code following some guys tutorial but I can't get it to run. The error says:

setMainQmlFile`, rootObject and showExpanded are not members of QQmlApplicationEngine

What it's supposed to do is get a signal from QML and print out a message (in console). Basically I'm trying to integrate C++ and QML.

EDIT

I've tried to replace some of the functions with some others that seemed appropriate (at least to me). I've also tried to find what to include so that these functions would work but with 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);
}

Thank You.


回答1:


I don't know where did you find you tutorial but, regarding Qt documentation, there is no such methods as setMainQmlFile nor showExpanded for QQmlApplicationEngine.

For setMainQmlFile(...), try to use instead setSource(...).

For showExpanded(), it's a QWidget function, and QQmlApplicationEngine do not inherit QWidget.

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

Edit: Looks like you'll have to use the Qt Quick 2 Application wizard of Qt Creator in order to re-create that QtQuick2ApplicationViewer class used in the tutorial you found.




回答2:


Using Qt 5.4.0 and Qt Creator 3.3.0, create New Project:

  1. Click New Project
  2. Qt Quick Application
  3. Click Choose...
  4. Name the project and select where to place it
  5. Click Next
  6. Select Qt Quick 2.4 from the drop-down menu
  7. Click Next
  8. Select desired Kit(s)
  9. Click Next
  10. Click Finish

Now You should see open main.qml file with 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 the following:

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 new class to Your project:

  1. Right Mouse Click project name in Projects viewer
  2. Click Add New...
  3. Select C++ Class if not already selected
  4. Click Choose...
  5. In Class name filed enter "MyCppClass"
  6. Set Base class to QObject
  7. Click Next
  8. Click Finish

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

#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 to 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 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 big green triangle to compile and run Your application. Watch Application Output area, click Hello World, You should see following message being printed out:

qml: Sending myQmlSignal from QML...

Signal was received by C++. It contains follwoing message: "Hello from QML"



来源:https://stackoverflow.com/questions/27473173/setmainqmlfile-rootobject-and-showexpanded-are-not-members-of-qqmlapplicatione

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!