我正在尝试将对象云从C ++发送到QML。我想使用model属性在QML中显示我的云的名称。我没有编译错误,但是当我执行代码时,将写入几则信息:
- QQUickView仅支持加载从QuickItem派生的根对象
为此,我尝试在QuickItem中更改我的所有QObject,但均未成功。
- 如果您的示例使用的是QML2,并且您加载的.qml文件具有“ import QTquick1,0”或“ import 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}
}
}
}
为了编写这段代码,我看了看QtQuick中的模型和视图,以及在QtQUick View中使用C ++模型。
预先感谢您的帮助 :)
问题出在您的主要职能上。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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句