Дизайн пользовательского интерфейса на QML или C++, BB10
Мне нужно написать приложение BB-10. В приложении может быть задействован пользовательский интерфейс с динамическими страницами и т. Д. Я думаю написать логику приложения (модели данных и т. Д.) На C++. Должен ли я использовать QML для дизайна пользовательского интерфейса? Насколько хорошо и гибко интегрируется C++ и QML? Я не столкнусь с некоторыми проблемами? Мой пользовательский интерфейс может состоять из множества страниц QML (или диалогов, отображаемых на панелях навигации и т. Д.), И когда пользователь щелкает некоторые действия в QML, я могу захотеть вызвать некоторый код C++ или перейти на другие страницы QML и т. Д. Спасибо за помощь.
3 ответа
Я ничего не знаю о мобильной разработке, но 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);
}
}