How to access (c++) model data from qml
-
wrote on 24 Jun 2013, 06:55 last edited by
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 } } }
}
@ -
wrote on 25 Jun 2013, 08:49 last edited by
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);
...
@
1/2