В следующем коде конструктор загружает файл Qml, который загружает данные из удаленного источника данных Json, и это прекрасно работает. Когда я вызываю метод startMenu, я использую тот же самый Qml в MainMenu.Qml, но как только я вызываю dataSource.load (), мое приложение вылетает в QDeclarativeExpression :: hasError (), после чего оно просто зависает. Нет сообщений об ошибках или исключений.
Если я переместить dataSource.load (); до нажатия кнопки это работает, но тогда у меня нет возможности загрузить мои данные при загрузке страницы.
#include "MyAppBB.hpp"
#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>
#include <bb/cascades/Button>
#include <bb/data/DataSource>
#include <wifi/wifi_service.h>
using namespace bb::cascades;
MyAppBB::MyAppBB(bb::cascades::Application *app) :
QObject(app) {
// create scene document from main.qml asset
// set parent to created document to ensure it exists for the whole application lifetime
bb::data::DataSource::registerQmlTypes();
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
this->myApp = app;
QDeclarativePropertyMap* propertyMap = new QDeclarativePropertyMap;
propertyMap->insert("name", QVariant(QString("Wes Barichak")));
propertyMap->insert("phone", QVariant(QString("519-555-0199")));
// create root object for the UI
this->root = qml->createRootObject<AbstractPane>();
qml->setContextProperty("propertyMap", propertyMap);
qml->setContextProperty("root", this);
QObject *newButton = root->findChild<QObject*>("btnLogin");
QObject::connect(newButton, SIGNAL(clicked()), this, SLOT(loginClick()));
// set created root object as a scene
app->setScene(root);
}
void MyAppBB::startMenu() {
QmlDocument *qml2 = QmlDocument::create("asset:///MainMenu.qml").parent(this);
AbstractPane *root2 = qml2->createRootObject<AbstractPane>();
this->myApp->setScene(root2);
}
Вот Qml
import bb.cascades 1.0
import bb.data 1.0
Page {
Container {
layout: StackLayout {
}TextField {
id: txtUsername
}
ListView {
id: myListView
// Associate the list view with the data model that's defined in the
// attachedObjects list
dataModel: dataModel
listItemComponents: [
ListItemComponent {
type: "item"
// Use a standard list item to display the data in the data
// model
StandardListItem {
title: ListItemData.identificationType
description: ListItemData.identificationTypeId
}
}
]
}
attachedObjects: [
GroupDataModel {
id: dataModel
// Sort the data in the data model by the "pubDate" field, in
// descending order, without any automatic grouping
sortingKeys: [
"ID"]
sortedAscending: false
grouping: ItemGrouping.None
},
DataSource {
id: dataSource
source: "http://192.168.150.1/JsonMobileApiService/Service1.svc/GetIDTypes"
type: DataSourceType.Json
onDataLoaded: {
dataModel.clear();
dataModel.insertList(data);
}
}
]
onCreationCompleted: {
txtUsername.setText("boo!");
// Statement below causes crash
dataSource.load();
}
}
}
Есть onCreationCompleted
слот в AbstractPane
, вы можете использовать это для вызова нагрузки.
Это в спецификации API для XMLDataAccess
В качестве примера. Я использую это для загрузки данных из файла XML самостоятельно, это работает
import bb.cascades 1.0
import bb.data 1.0
Page {
content: ListView {
id: listView
dataModel: dataModel
...
}
attachedObjects: [
GroupDataModel {
id: dataModel
},
DataSource {
id: dataSource
source: "contacts.xml"query: "/contacts/contact"onDataLoaded: {
dataModel.insertList(data);
}
}
]
onCreationCompleted: { dataSource.load(); }
}
Других решений пока нет …