C++을 사용하여 XML 데이터 모델을 (. 단추를 클릭하면) .qml 파일에서 dinamically 변경하도록 예제를 만들려고합니다. 이를 위해 Qt 속성 (GroupDataModel)을 반환합니다. 그러나 개체를 반환 한 후에도 ListView는 변경되지 않지만 model 속성이 다시 반환되는 것을 볼 수 있습니다.XML이 ListView에서 변경되지 않습니다.
OBS : C++ 코드로로드하는 대신 .qml의 XMLDataModel에서로드하면 작동합니다. XmlTest.cpp
#ifndef XmlTest_HPP_
#define XmlTest_HPP_
#include <QObject>
#include <bb/cascades/GroupDataModel>
namespace bb { namespace cascades { class Application; }}
class XmlTest : public QObject
{
Q_OBJECT
Q_PROPERTY(bb::cascades::GroupDataModel* model READ model NOTIFY onModelChanged);
public:
XmlTest(bb::cascades::Application *app);
virtual ~XmlTest() {}
Q_INVOKABLE
bb::cascades::GroupDataModel *model();
Q_INVOKABLE
void setGroupDataModel();
signals:
void onModelChanged();
private:
bb::cascades::GroupDataModel *m_model;
};
#endif /* XmlTest_HPP_ */
과 :
#include "XmlTest.hpp"
#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>
#include <bb/data/XmlDataAccess>
using namespace bb::cascades;
using namespace bb::data;
XmlTest::XmlTest(Application *app)
: QObject(app)
{
m_model = new GroupDataModel();
qRegisterMetaType<GroupDataModel *>("GroupDataModel *");
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
qml->setContextProperty("_xmlTest", this);
AbstractPane *root = qml->createRootObject<AbstractPane>();
app->setScene(root);
}
GroupDataModel *XmlTest::model()
{
qDebug("Returning m_model");
return m_model;
}
void XmlTest::setGroupDataModel()
{
XmlDataAccess xml;
QVariant xmlData = xml.load(QDir::currentPath() + "/app/native/assets/models/model.xml");
m_model->clear();
m_model->insertList(xmlData.toList());
qDebug("File loaded");
emit this->onModelChanged();
}
내 main.qml 파일 (버튼이 단지의 ListView) :
이
내 XmlTest.hpp입니다import bb.cascades 1.0
Page {
Container {
id: mainContainer
layout: DockLayout {}
ListView {
id: listView
dataModel: _xmlTest.model
//dataModel: XmlDataModel {
// source: "models/model2.xml"
//}
onDataModelChanged: {
console.log("Data model changed!");
}
listItemComponents: [
ListItemComponent {
type: "user"
StandardListItem {
title: ListItemData.realname
description: ListItemData.name
}
},
ListItemComponent {
type: "option"
StandardListItem {
title: ListItemData.title
}
}
]
}
Button {
text: "Click"
onClicked: {
console.log("Trying to load file");
_xmlTest.setGroupDataModel();
}
verticalAlignment: VerticalAlignment.Bottom
horizontalAlignment: HorizontalAlignment.Center
}
}
}
및로드하려는 XML :
<root>
<user name="myUsername" realname="My Real Name"/>
<option title="Option 1"/>
<option title="Option 2"/>
<option title="Option 3"/>
<option title="Option 4"/>
<option title="Option 5"/>
</root>
Q_INVOKABLE은 슬롯이 아니며 QML에 노출 된 메서드 일뿐입니다. 그들은 값을 반환 할 수 있습니다. – craigmj