Мне нужно написать приложение BB-10.
В приложении может быть довольно сложный пользовательский интерфейс с динамическими страницами и т. Д.
Я думаю написать логику приложения (модели данных и т. Д.)
в C ++.
Должен ли я использовать QML для дизайна пользовательского интерфейса? Насколько хорошо и гибко идет интеграция?
между C ++ и QML? Не столкнусь ли я с некоторыми проблемами?
Мой пользовательский интерфейс может состоять из множества страниц QML (или диалогов, отображаемых на панелях навигации и т. Д.),
и когда пользователь нажимает на некоторые действия в QML, я могу вызвать C ++
код или перейти на другие страницы QML и т. д.
Спасибо за помощь.
Я ничего не знаю о мобильной разработке, но QML хорош, должен облегчить поддержку интерфейсов, их модификацию и перенос на другие устройства.
Интеграция QML и C ++ проста, если вы хорошо используете инфраструктуру Qt, используя QObjects, Q_PROPERTY
а также Q_INVOKABLE
методы … это действительно легко.
РЕДАКТИРОВАТЬ: Я должен добавить, однако, что я не нашел доступ к объектам QML из C ++ так просто, как наоборот. Это связано с тем, что QML организует объекты в иерархии из нескольких типов данных, и вы должны динамически обнаруживать дочерние узлы, используя findChild
или проверка objectName
,
В любом случае, поскольку QML позволяет связывать свойства, вы должны иметь возможность создавать некоторые классы C ++ с вашими данными и получать к ним доступ через пользовательский интерфейс без особых усилий;)
Я также прохожу через такую ситуацию, когда вам нужен контроль над приложением с использованием C ++, когда qml не так уж и много. Лучший способ наследовать ваш класс с помощью NavigationPane и поместить туда логику, добавив вашу первую страницу, используя QmlDocument::create()
если у вас есть страница рядом с навигационной таблицей, добавьте метод к этому классу, который Q_INVOKABLE
и передать setContext этот класс, когда вы создаете новую страницу, используя QmlDocument::create()
чтобы получить доступ к этим методам .. наконец, никогда не забывайте добавлять или обрабатывать OnTrasitionEnded(Page*)
сигнал для удаления страниц и освобождения памяти
Краткий ответ: интеграция C ++ / QML очень хорошая. Иногда это может быть очень многословно, но в C ++ вы ничего не можете сделать.
Даже если делать все в C ++ немного быстрее. BlackBerry продвигает идею кодировать весь рабочий процесс пользовательского интерфейса в QML / Javascript.
Преимуществом будет четкое разделение между бизнес-логикой & поток приложения. Еще одним преимуществом является то, что QML короче, чтобы написать и, надеюсь, поддерживать. Не забывайте, что вы можете создавать новые объекты QML в C ++.
onTriggered: {
var item = dataModel.data(indexPath);
if (item.count > 0) {
appLogic.updateFeed(item.id);
navPane.push(resultPage);
}
}