2017-06-30 16 views
1

リストでC++クラスがQObjectから継承しなければならないことがドキュメントで明確になっていますが、リスト内のオブジェクトがQObjectでなければならないかどうかは不明です。
私はQQmlListPropertyでthisアプローチを試してみましたし、またQQmlListPropertyで、私は両方のケースでは、次のエラーを取得:QML:QQmlListProperty <T>。 TはQObjectである必要がありますか?

QMetaProperty ::読み:プロパティ「nsのための未登録データ型「QQmlListProperty <QString>」を扱うことができません::ステータス::値

編集:私のコード:

.HPP:

namespace ns{ 
class Status : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QQmlListProperty<QString> values READ values NOTIFY valuesChanged) 

public: 
    Status(QObject* parent = Q_NULLPTR); 
    virtual ~Status(); 

    bool updateValues(const std::vector<std::string>& values); 

    QQmlListProperty<QString> values(); 
    int valueCount() const; 
    QString* value(int) const; 

signals: 
    void valuesChanged(); 

private: 
    QVector<QString*> m_values_; 

    std::vector<QString> m_valueStorage_; 

    static int valueCount(QQmlListProperty<QString>*); 
    static QString* value(QQmlListProperty<QString>*, int); 
}; 
} 

た.cpp:

using namespace ns; 
Status::Status(QObject* parent) : 
    QObject(parent), 
    m_values_(2), 
    m_valueStorage_(2) 
{} 

Status::~Status(){} 

bool Status::updateValues(const std::vector<std::string>& values) 
{ 
    //Do Stuff 

    emit valuesChanged(); 
    return true; 
} 

QQmlListProperty<QString> Status::values() 
{ 
    return QQmlListProperty<QString>(this, nullptr, &Status::valueCount, &Status::value); 
} 

int Status::valueCount() const 
{ 
    return m_values_.count(); 
} 

QString* Status::value(int index) const 
{ 
    return m_values_.at(index); 
} 

int Status::valueCount(QQmlListProperty<QString>* list){ 
    return reinterpret_cast<Status*>(list->data)->valueCount(); 
} 

QString* Status::value(QQmlListProperty<QString>* list, int i){ 
    return reinterpret_cast<Status*>(list->data)->value(i); 
} 

QML:メインでも

import Foo 1.0 
Rectangle { 
    Status { 
     id: status 
     objectName: "Status" 
    } 

    Component { 
     id: value 
     Rectangle { Text: {text: modelData } } 
    } 

    ColumnLayout { 
     Repeater { model: status.values; delegate: value } 
    } 
} 

、私はQQmlApplicationEngineにQMLファイルをロードする前に:

qmlRegisterType<ns::Status>("Foo", 1,0, "Status"); 
+0

コードを表示します。 – Azeem

+0

@Azeem私の質問を編集しました。 –

+0

'QQmlListProperty'の意図された使い方は、QML側から移入できるリストを公開することです。 C++データをQMLに公開しない。あなたがそれをしたいならば、 'QAbstractListModel'があなたに適しています。 – GrecKo

答えて

3

QQmlListPropertyは実際にQObjectと一緒に使用されることを意味します。

QMLエンジンはすべてがテンプレート化されているため、この制限を適用するクラスはありませんが、QObjectのサブクラスであると、QMLエンジンは想定しています。

Qtのドキュメントには、QQmlListReference(C++からQQmlListPropertyを操作するように作られたクラス)のドキュメントに記載されているように示されています。 この段落には、QObjectが記載されています。

QMLリストのプロパティは型セーフです。正しい基本クラスから派生したQObjectのみがリストに割り当てられます。 listElementType()メソッドを使用して、サポートされるQObject型のQMetaObjectを照会することができます。不正な型のオブジェクトをリストプロパティに追加しようとすると失敗します。

QObject *QQmlListReference::at(int index) constの方法もまた別の手掛かりです。

+0

ああ、私はそれを逃した。ありがとうございました。 –

関連する問題