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

时间:2014-12-14 19:29:07

标签: c++ qt qml qt5.4

我在一些人教程之后编写了这段代码,但我无法运行它。错误说:

  

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

谢谢。

2 个答案:

答案 0 :(得分:0)

我不知道你在哪里找到了教程,但是关于Qt文档,setMainQmlFile没有showExpandedsetMainQmlFile(...)这样的方法。

对于setSource(...),请尝试使用showExpanded()

对于QWidget,它是QQmlApplicationEngine函数,而QWidget不会继承rootObject()

关于rootObjects(),它可能是拼写错误,您可以使用返回QList<QObject*>的{​​{1}}。

编辑:您似乎必须使用Qt Creator的Qt Quick 2应用程序向导才能重新创建您找到的教程中使用的QtQuick2ApplicationViewer类。

答案 1 :(得分: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. 点击完成

  11. 现在您应该看到使用以下代码打开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. 在班级名称中输入“MyCppClass”
    6. 将基类设置为QObject
    7. 点击下一步
    8. 点击完成

    9. 打开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的Hello”