How to access (c++) model data from qml
-
Hi,
I'm new with qlm and I have a problem to access data from a Subclass in my ListModel (derived from QAbstractListModel ).
I use the ListModel with a ListView and everything is fine. But I also wanna access the Data outside of the ListView. For this reason I use a public slot to get the data from my (c++) ListModel dependent on the current selected item in the ListView. This part also works fine, but from this point I could not access the explicit model (entry) stored in my ListModelHere some code snippets:
I hope your guys can help me.main.cpp
@
ListModel *listModel = new ListModel();
listModel->add(new Subclass("Class 1", "Class 1.1", "Class 1.2") );// qmlRegisterInterface<ListModel>("ListModel");
qmlRegisterInterface<Parent>("Parent");
qmlRegisterInterface<Subclass>("Subclass");qRegisterMetaType<Parent>("Parent"); qRegisterMetaType<Parent>("Subclass"); QtQuick2ApplicationViewer viewer; viewer.rootContext()->setContextProperty("listModel", listModel); viewer.setMainQmlFile(QStringLiteral("qml/test/main.qml")); viewer.showExpanded();
@
parent.h
@
class Parent : public QObject
{
Q_OBJECT
Q_PROPERTY(QString firstname READ getFirstname WRITE setFirstname NOTIFY firstNameChanged )
Q_PROPERTY(QString lastname READ getLastname WRITE setLastname NOTIFY lastNameChanged)public:
explicit Parent(){}
explicit Parent(const QString &first, const QString &last,QObject *parent = 0);
Parent( const Parent &p);
Parent& operator=(const Parent & p);signals:
public slots:
QString getFirstname() const;
QString getLastname() const ;void setFirstname( const QString &firstname); void setLastname( const QString &lastname);
private:
QString _firstname;
QString _lastname;signals:
void firstNameChanged();
void lastNameChanged();};
Q_DECLARE_METATYPE( Parent )
@@
class Subclass : public Parent
{
Q_OBJECTQ_PROPERTY(QString scublassname READ getSubclassName WRITE setSubclassName NOTIFY subclassNameChanged)
public:
Subclass(){}
Subclass( const QString &last, const QString &first, const QString &sub);
Subclass( const Subclass &subclass);
Subclass& operator=(const Subclass & subclass);public slots:
QString getSubclassName() const ;
void setSubclassName(const QString & name);private:
QString _className;signals:
void subclassNameChanged();
};Q_DECLARE_METATYPE( Subclass )
@main.qml
@
import QtQuick 2.0Rectangle {
width: 360
height: 360Component { id: decorator Rectangle{ height: 100 width: 360 color: "yellow" opacity: 0.5 Text { text: '<b>Firstname:</b> ' + model.firstname1 + '<br>' + '<b>Lastname:</b> ' + model.lastname1 + '<br>' + '<b>SubclassName:</b> ' + model.scublassname1 + '<br>' } MouseArea { anchors.fill: parent; onClicked:{ listview.currentIndex = index; } } } } ListView{ id: listview anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right height: 200 model: listModel delegate: decorator spacing: 15 focus: true clip: true } Rectangle{ color: "blue" anchors.top: listview.bottom anchors.left: parent.left anchors.right: parent.right height: 160 Text{ anchors.fill: parent text: { "index =["+listview.currentIndex+"] " + listModel.get(listview.currentIndex).firstname } } }
}
@ -
How is defined "get" method in your ListModel? You have mentioned that you are using public slot, but slot should return void. If you need to expose non-void method to QML you need to define it like this:
@
...
public:
Q_INVOKABLE Parent* get(const int &index);
...
@