在QML中使用C ++模型,白页

凸轮

我正在尝试将对象云从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 ++模型。

预先感谢您的帮助 :)

king_nak

问题出在您的主要职能上。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章