LINUX.ORG.RU

Доступ к QML из Qt и наоборот

 ,


0

2

Допустим, я хочу в программе активно сообщать QML и Qt и хочу сделать некоторый API, который бы дергал как QML код так и Qt код. Судя по всему есть три варианта.

  • Я пишу QML объекты и для доступа из Qt дергаю в коде их свойства по именам.
  • Я делаю производные от QObjectов с Q_PROPERTY и загружаю их в QML Engine.
  • Я делаю QML объекты и делаю производные QObjectов и пишу отдельный модуль для того, чтобы связать QML объекты с QObjectами и дергаю QObjectы из Qt и QML объекты из QML.

В первом случае мне не нравится тот факт, что я в статический типизированном языке, в большей части программы я буду костыляться с динамической природой QML и всюду будет куча левого кода, а если левого кода не будет, то будет куча ненадежного кода.

Во втором случае мне не нравится то, что в QML коде я не смогу явно увидеть API и без отдельной документации нужно будет лезть в C++ код, чтобы понять какие свойства есть у объекта.

В третьем случае мне не нравится то, что мне придеться дублировать по сути одно и тоже API в QML коде и в C++ коде и придеться править больше кода при смене интерфейса. Это не критично если каждый метод API дергается в 100 разных местах (но критично дергать методы в 100 разных местах), но, обычно, люди стараются так не делать и каждый метод будет вызываться в одном - двух местах. По этому, по факту, это просто в два раза больше работы чем в первом или втором случае.

Кто писал на Qt + QML, как лучше сделать? Или я просто не могу найти бритву?



Последнее исправление: summon (всего исправлений: 3)

Вариант 2. Для документации есть специальный текстовый формат, через который типы доступны в QML: http://doc.qt.io/qt-5/qtqml-modules-qmldir.html#writing-a-qmltypes-file

Но даже и без него, если QtCreator видит исходники, зарегистрированные в qmlRegisterType(), то нормально разворачивает типы.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Спасибо, я тоже склоняюсь к этому варианту.

summon
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.