четверг, 2 февраля 2012 г.

Портирование моделей данных из Qt в QML, Вариант 1


Портирование моделей данных из 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(); // получение указателя на главный объект QML
    QObject::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"));
}


После запуска у меня появляется окно с необходимыми данными. Ну а после этого всё зависит лишь от вашей фантазии.



Комментариев нет:

Отправить комментарий