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 :)
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
Nein, das Problem ist, dass das Wurzelelement in Ihrer QML 'ApplicationWindow' ist. Es sollte funktionieren, wenn Sie z.B. 'Rectangle' –
ok danke für Ihre klaren Erklärungen – Cam