在QML中使用C++模型,白页
问题描述:
我试图从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 QtQuick和Using C++ Models with QtQUick View
预先感谢您的帮助:)
答
的问题是在你的主要功能。 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;
好吧我现在明白了,谢谢。这是否意味着它会工作,而不是在main.qml中写入我的ListView,我会将它写入其他qml文件中? – Cam
不,问题在于QML中的根元素是“ApplicationWindow”。如果你使用例如'长方形' –
好的谢谢你的明确解释 – Cam