2016-05-30 6 views
0

Ich versuche, ein Objekt Cloud von C++ zu QML zu senden. Ich möchte den Namen meiner Cloud in der QML mithilfe der Modelleigenschaft anzeigen. Ich habe keine Kompilierungsfehler aber wenn ich den Code severals Infos auszuführen sind schreiben:Verwendung von C++ - Modell in QML, weiße Seite

  • QQUickView nur Laden von Wurzelobjekten unterstützt, die

für diesen von QuickItem ableiten i‘ Ich habe versucht, alle meine QObject in QuickItem zu ändern, ohne Erfolg.

  • Wenn Ihr Beispiel QML2 verwendet, und die .qml Datei, die Sie 'Import QTquick1,0' oder 'Import QT 4,7' geladen hat, wird dieser Fehler auftreten

Ich suche nach dem Import signalisiert, aber ich kann keine QtQuick1,0 oder QT4 7 in meinem Code finden.

Hier mein 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 

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

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

Und schließlich meine 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} 
     } 
    } 
} 

diesen Code zu schreiben habe ich einen Blick auf Models and views in QtQuick und Using C++ Models with QtQUick View

Sie für Ihre Hilfe im Voraus Danke :)

Antwort

0

Das Problem in der Hauptfunktion ist. QQuickView ist eine schnelle Möglichkeit, eine QML-Szene in einem Fenster anzuzeigen (QQuickView ist selbst eine Unterklasse von QQuickWindow). In Ihrer QML ist das Stammobjekt ApplicationWindow. Sie können kein Fenster in einem Fenster anzeigen.

Die Lösung ist QQmlApplicationEngine zu wechseln:

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

Das zweite Problem mit Ihrem Modell. ListView würde ein QList<QObject*> verstehen, aber kein QList<Cloud*>. Ändern Sie einfach die Deklaration zu:

QList<QObject*> cloudList; 
+0

Ok ich verstehe jetzt, danke. Bedeutet das, dass es funktionieren würde, wenn ich mein ListView nicht in der main.qml schreiben würde, sondern in eine andere qml-Datei schreiben würde? – Cam

+0

Nein, das Problem ist, dass das Wurzelelement in Ihrer QML 'ApplicationWindow' ist. Es sollte funktionieren, wenn Sie z.B. 'Rectangle' –

+0

ok danke für Ihre klaren Erklärungen – Cam