2016-05-30 18 views
0

我试图从C++发送一个对象云到QML。我想使用模型属性在QML中显示我的云的名称。 我没有编译错误,但是当我执行的代码severals的相关信息都写道:在QML中使用C++模型,白页

  • QQUickView只支持根对象的装载,从 获得QuickItem

这一个我”我试图在QuickItem中更改所有的QObject,但没有成功。

  • 如果你的例子是使用QML2,你加载的.qml文件有 '进口QTquick1,0' 或 '进口QT 4,7',会出现此错误

我寻找导入的信号,但在我的代码中找不到任何QtQuick1,0或QT4 7。

这里我Cloud.h:

#ifndef CLOUD_H 
#define CLOUD_H 

#include <QObject> 

class Cloud: public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) 
    Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged) 

public: 
    Cloud(QObject *parent=0); 
    Cloud(const QString &name, const QString &description, QObject *parent=0); 

    QString name() const; 
    void setName(const QString &name); 

    QString description() const; 
    void setDescription(const QString &name); 

signals: 
    void nameChanged(); 
    void descriptionChanged(); 

private: 
    QString m_name; 
    QString m_description; 
}; 

#endif // CLOUD_H 

我Cloud.cpp

#include "cloud.h" 
#include <QDebug> 


Cloud::Cloud(QObject *parent) 
    :QObject(parent) 
{ 

} 

Cloud::Cloud(const QString &name, const QString &description, QObject *parent) 
    :QObject(parent), m_name(name), m_description(description) 
{ 
} 
QString Cloud::name() const{ 
    return m_name; 
} 
void Cloud::setName(const QString &name){ 

    if(name != m_name){ 
     m_name = name; 
     emit nameChanged(); 
    } 
} 
QString Cloud::description() const{ 
    return m_description; 
} 
void Cloud::setDescription(const QString &description){ 
    if(description != m_description){ 
     m_description = description; 
     emit descriptionChanged(); 
    } 
} 

我的main.cpp

#include <QGuiApplication> 

#include <qqml.h> 
#include <QtQuick/qquickitem.h> 
#include <QtQuick/qquickview.h> 
#include <QQmlContext> 

#include "cloud.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 
    qmlRegisterType<Cloud>("Sky", 1,0,"Cloud"); 


    QList<Cloud*> cloudList; 
    cloudList.append(new Cloud("Cumulus Mediocris", "super nuage brocoli")); 
    cloudList.append(new Cloud("Cumulus Towering", "super nuage tour")); 
    cloudList.append(new Cloud("Cumulonimbus", "Gros nuage pas content")); 

    QQuickView view; 
    view.setResizeMode(QQuickView::SizeRootObjectToView); 
    QQmlContext *ctxt = view.rootContext(); 
    ctxt->setContextProperty("myModel", QVariant::fromValue(cloudList)); 

    view.setSource(QUrl("qrc:main.qml")); 
    view.show(); 

    return app.exec(); 
} 

最后我main.qml:

import QtQuick 2.4 
import QtQuick.Controls 1.3 
import QtQuick.Window 2.2 
import QtQuick.Dialogs 1.2 


ApplicationWindow { 
    title: qsTr("Hello World") 
    width: 640 
    height: 480 
    visible: true 
    Rectangle{ 
     width:10;height:10 
     color:"red" 
     anchors.left : parent.left 
     anchors.top:parent.top 
    } 

    ListView{ 
     width:100;height:100 

     model: myModel 
     delegate:Rectangle{ 
      height:25 
      width:100 
      color:"pink" 
      Text{text:model.modelData.name} 
     } 
    } 
} 

为了写这个代码,我接过来一看,以Models and views in QtQuickUsing C++ Models with QtQUick View

预先感谢您的帮助:)

回答

0

的问题是在你的主要功能。 QQuickView是在窗口中显示QML场景的快速方法(QQuickView本身就是QQuickWindow的子类)。在你的QML中,根对象是ApplicationWindow。您不能在窗口内显示窗口。

的解决方案是切换到QQmlApplicationEngine

QQmlApplicationEngine view; 
QQmlContext *ctxt = view.rootContext(); 
ctxt->setContextProperty("myModel", QVariant::fromValue(cloudList)); 
view.load(QUrl("qrc:main.qml")); 

的第二个问题是你的模型。 ListView会理解QList<QObject*>,但不是QList<Cloud*>。只是将声明更改为:

QList<QObject*> cloudList; 
+0

好吧我现在明白了,谢谢。这是否意味着它会工作,而不是在main.qml中写入我的ListView,我会将它写入其他qml文件中? – Cam

+0

不,问题在于QML中的根元素是“ApplicationWindow”。如果你使用例如'长方形' –

+0

好的谢谢你的明确解释 – Cam