Мне нужно иметь массив объектов класса, которые должны быть доступны в Qt, а также QML.Как получить доступ к QList QObject * в QML и Qt?
Учитывая https://stackoverflow.com/a/15830797/462608 следующее, что я пробовал.
Теперь мне нужно знать, как читать и писать к функциям ClassA
через Qt
и QML
.
См. Инструкцию print в конструкторе в файле .h. Это вызывает ошибку сегментации.
class.h
#ifndef CLASSA
#define CLASSA
#include <QQuickItem>
class ClassA : public QObject
{
private:
Q_OBJECT
Q_PROPERTY(int one READ one WRITE setOne NOTIFY oneChanged)
int m_one;
public:
ClassA() {}
int one() const { return m_one; }
public slots:
void setOne(int arg)
{
if (m_one == arg)
return;
m_one = arg;
emit oneChanged(arg);
}
signals:
void oneChanged(int arg);
};
class ClassB : public QObject
{
private:
Q_OBJECT
Q_PROPERTY(QList <QObject*> objClassAList READ objClassAList WRITE setObjClassAList NOTIFY objClassAListChanged)
QList <QObject*> m_objClassAList;
public:
ClassB()
{
QList <QObject*> localObjList;
for (int i = 0; i < 5; i++)
{
ClassA localObj;
localObj.setOne (100);
localObjList.push_back (&localObj);
}
setObjClassAList (localObjList);
qDebug() << "QQQQQQQQQQQQQQ: " << objClassAList()[0]->property ("one");
}
QList <QObject*> objClassAList() const { return m_objClassAList; }
public slots:
void setObjClassAList (QList <QObject*> arg)
{
if (m_objClassAList == arg)
return;
m_objClassAList = arg;
emit objClassAListChanged(arg);
}
signals:
void objClassAListChanged (QList <QObject*> arg);
};
#endif // CLASSA
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "class.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
const char* what = "WHAT";
qmlRegisterType <ClassA> (what, 1, 0, "A");
qmlRegisterType <ClassB> (what, 1, 0, "B");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import WHAT 1.0
Window {
visible: true
B
{
onObjClassAListChanged:
{
}
}
}
Разбить линию objClassAList() [0] -> свойство («один») и проверить, что возвращаемый массив имеет действительный QList с хотя бы одним элементом в нем. Кроме того, objClassAList() [0] -> свойство («один») -> isValid() возвращает true? – TheDarkKnight