0

我已经按照一些人的教程编写了这段代码,但我无法让它运行。错误说:

setMainQmlFile`、rootObject 和 showExpanded 不是 QQmlApplicationEngine 的成员

它应该做的是从 QML 获取信号并打印出一条消息(在控制台中)。基本上我正在尝试集成 C++ 和 QML。

编辑

我试图用其他一些似乎合适的功能(至少对我来说)替换一些功能。我还试图找到要包含的内容,以便这些功能可以工作,但没有运气。

   #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);
}

谢谢你。

4

2 回答 2

0

使用 Qt 5.4.0 和 Qt Creator 3.3.0,创建新项目:

  1. 点击新建项目
  2. Qt 快速应用程序
  3. 点击选择...
  4. 为项目命名并选择放置位置
  5. 点击下一步
  6. 从下拉菜单中选择 Qt Quick 2.4
  7. 点击下一步
  8. 选择所需的套件
  9. 点击下一步
  10. 点击完成

现在您应该看到带有以下代码的打开的 main.qml 文件:

import QtQuick 2.4
import QtQuick.Window 2.2

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

    }
}

对文件进行更改,使其如下所示:

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")

            //################
        }
    }
}

将新类添加到您的项目:

  1. 在项目查看器中右键单击项目名称
  2. 单击添加新...
  3. 如果尚未选择,请选择 C++ 类
  4. 点击选择...
  5. 在 Class name 字段中输入“MyCppClass”
  6. 将基类设置为 QObject
  7. 点击下一步
  8. 点击完成

打开 mycppclass.h 文件,它应该如下所示:

#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

对 mycppclass.h 进行更改,使其如下所示:

#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

打开 mycppclass.cpp,它应该如下所示:

#include "mycppclass.h"

MyCppClass::MyCppClass(QObject *parent) : QObject(parent)
{

}

MyCppClass::~MyCppClass()
{

}

将其更改为:

#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;

    //################
}

打开 main.cpp,如下所示:

#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();
}

并进行以下更改:

#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();
}

单击绿色大三角形编译并运行您的应用程序。观看应用程序输出区域,单击 Hello World,您应该会看到打印出以下消息:

qml:从 QML 发送 myQmlSignal...

信号被 C++ 接收。它包含以下消息:“来自 QML 的你好”

于 2015-01-05T20:26:57.787 回答
0

我不知道你在哪里找到你的教程,但是关于 Qt 文档,没有setMainQmlFileQQmlApplicationEngineshowExpanded方法

对于setMainQmlFile(...),尽量改用setSource(...)

对于showExpanded(),它是一个QWidget函数,并且QQmlApplicationEngine不继承QWidget

关于rootObject(),可能是错字,您可以使用rootObjects()which return a QList<QObject*>

编辑:看起来您必须使用 Qt Creator 的 Qt Quick 2 Application 向导才能重新创建QtQuick2ApplicationViewer您找到的教程中使用的该类。

于 2014-12-14T21:51:17.327 回答