Pull to refresh
8
Karma
0
Rating
Роман @sushinskiy

C++ программист

Автоматический контроль времени жизни общих C++-QML объектов

Я так понял, Вы имеете в виду, что Approx будет оберткой над общим объектом и будет делигировать вызовы функций/свойств/слотов/сигналов этому объекту. Это можно было бы реализовать с помощью переопределения функции QMetaObject::qt_metaCall(). Этот похдход имеет место, но в нем есть два недостатка:

1.Фунции, которые экспортируют объект в QML, должны иметь возвращаемый тип QObject*, а не тот тип, который реально хотим экспортировать
Например, уже не получиться реализовать функцию подобным образом:
Q_INVOKABLE SomeObject* createObject(QString const& name, int value) {
 Approx *toQML = new Approx();
 return toQML;
}

только так:
Q_INVOKABLE QObject* createObject(QString const& name, int value) {
 Approx *toQML = new Approx();
 return toQML;
}

Если реализовывать такой подход, теряется типобезопасность, ведь подобные функции могут вызываться так же из C++ кода.

2. второй недостаток не столь существенный, однако он есть: Qt Creator не сможет авктопомплитить свойства, методы этого объекта в QML коде.

Автоматический контроль времени жизни общих C++-QML объектов

В случае если мы его создадим в куче и передадим в QML во владение, то Qml разрушит обеъкт, когда его ссылки закончатся. После этого C++ обратится уже к разрушенному объекту.

Автоматический контроль времени жизни общих C++-QML объектов

Тесты пока нет возможности выложить. Как появится — обязательно выложу

Автоматический контроль времени жизни общих C++-QML объектов

И отдавать в QML указатель класса Approx? Но тода при выходе из области видимости объект класса Approx разрушится, разрушив d_ptr и QML в дальнейшем будет иметь доступ к уже невалидному объекту.

Автоматический контроль времени жизни общих C++-QML объектов

Я думал о идее, чтоб сам умный указатель представлял тот объект, который мы хотим экспортировать, однако столкнулся с подводными камнями, когда объест на стороне C++ сам себя разрушает. Не могли бы вы написать пример(хотя бы псевдокод)? Возможно я что-то упустил…

Автоматический контроль времени жизни общих C++-QML объектов

Спасибо, за ценное замечание по поводу использования. В ближайшее время допишу пример использования.

Автоматический контроль времени жизни общих C++-QML объектов

Что именно по вашему можно было бы вынести в приватную имплементацию? На мой взгляд реализации стратегий — возможно. Других мыслей не приходит. В плане архитекруты класс далек от идеала и его можно реструктурировать и расширять на свой «вкус». В этой стать сделан основной упор на автоматические контроль жизни объектов, расшаренных в QML-C++.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity