Портирование моделей данных из Qt в QML, Вариант 1
(релиз Qt SDK на момент написания данной статьи - 1.2.0)Основная проблема QML - отсутствие нормальной работы с динамическими данными (да, оно есть, но далеко не в таком виде, как хотелось бы).
В этой статье я расскажу два способа работы с моделями данных с тем раскладом, что данные вам необходимо портировать из Qt в QML.
Вариант 1: передача данных через сигналы/слоты.
Этот способ удобен тогда, когда вам необходимо передать данные и забыть о них.
в основном QML файле создаём собственно модель (можно пустую, можно заполненную) и функцию, которая будет добавлять данные в нашу модель:
ListModel
{
id: myModel
}
function addContact(name, phone)
{
myModel.append({"name": name, "phone" : phone})
console.log(myModel.count)
}
При вызове функции addContact к модели каждый раз будет присоединятся по одному элементу данных.
В С++ мы должны получить указатель на главный объект QML и подключить к этому слоту (функции) сигнал, который будет передавать необходимые данные (в нашем случае имя и телефон). Обратите внимание, в QML функции переменные функции задаются без типа данных. Когда мы будет подключать сигнал к этой функции, данный должны быть в формате QVariant.
Моя функция main выглядит следующим образом:
Q_DECL_EXPORT int main(int argc, char *argv[]){QScopedPointer<QApplication> app(createApplication(argc, argv)); // задано автоматическиQmlApplicationViewer viewer;viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); // задано автоматическиviewer.setMainQmlFile(QLatin1String("qml/QtModelToQML/main.qml")); // задано автоматическиviewer.showExpanded(); // задано автоматическиDataSender *sender = new DataSender(); // создание объекта, который будет пересылать даныеQObject *mainObject = viewer.rootObject(); // получение указателя на главный объект QMLQObject::connect(sender, SIGNAL(sendData(QVariant,QVariant)), mainObject, SLOT(addContact(QVariant,QVariant))); // подключение сигнала к слотуsender->setData(); // вызываю несколько раз сигналreturn app->exec();}
DataSender - замописный класс, у которого кроме конструктора есть сигнал sendData и метод set описание сигнала в заголовочном файле выглядит следующим образом:
void sendData(QVariant name, QVariant phone);
Функция setData просто отправляет сигнал несколько раз:
void DataSender::setData()
{
emit this->sendData(QVariant("Voin2"), QVariant("02"));
emit this->sendData(QVariant("Voin5"), QVariant("02"));
emit this->sendData(QVariant("Voin2"), QVariant("10"));
}
После запуска у меня появляется окно с необходимыми данными. Ну а после этого всё зависит лишь от вашей фантазии.
Комментариев нет:
Отправить комментарий