リストで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");
コードを表示します。 – Azeem
@Azeem私の質問を編集しました。 –
'QQmlListProperty'の意図された使い方は、QML側から移入できるリストを公開することです。 C++データをQMLに公開しない。あなたがそれをしたいならば、 'QAbstractListModel'があなたに適しています。 – GrecKo