LINUX.ORG.RU

QML, Qt, Зависимые интерфейсы.

 , ,


0

2

Доброго дня.

Никак не могу сообразить...

Первое: Есть некий клиент, который умеет соединяться, отсоединяться, писать, читать...в общем все как обычно.

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

qmlRegisterType<ClientType>( "my.test", 1, 0, "Client" );

Все работает. Из QML можно и соединяться и ловить сигналы.

Второе:

Этим клиентом пользуются некоторые другие сущности - классы-имплементации, которые пишут и читают в зависимости от своих нужд.

В С++ это выглядит вот как-то так

...
auto t = ITestImpl::create( client );
t->GetSomeData( );
...

Эти классы-имплементации я хочу тоже вынести как типы в QML. Но объекты этих классов всегда требуют наличие клиента.

Вопрос в этом: Как в QML такие ситуации правильно разруливать? Компоненты должны быть описаны в регионе клиента?

Client { 
    id: first
    TestImpl {
        ...
    }
}

или можно как-то передавать в качестве параметра в ID? (И как в этом случае должно выглядеть описание Q_PROPERTY?)

Client { 
    id: first
}
TestImpl {
    ...
    clientId: first
}

Клиентов может быть не один.

И как в этих случаях из кода C++ получить клиента для определенного ITestImpl? (сигналы, слоты, данные...)

Спасибо.

★★

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

Тут нужно определиться должен ли создаваться каждому свой клиент или клиент может быть общим для других сущностей или QML-обьектов. Также нужно помнить, что обьявление элемента в QML равносильно созданию его экземпляра.

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

помнить, что обьявление элемента в QML равносильно созданию его экземпляра.

Это я в курсе.

свой клиент или клиент может быть общим для других сущностей или QML-обьектов

Клиент может быть один для многих.

Мне просто не понятно, как это должно выглядеть в коде C++ в тех двух случаях, что описал. И вообще как правильнее это делать в QML.

Я останавливаюсь на первом варианте, когда

Client { 
    id: first
    TestImpl {
        ...
    }
    Test2Impl {
        ...
    }
}

Но может QML может и так и так, тогда было б совсем хорошо.

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

Второй вариант предпочтительней, тогда нужно реализовать Q_PROPERTY(Client* READ client WRITE setClient NOTIFY clientChanged). При создании будет вызван метод setClient() с указателем на другой объект из QML. Также вместо Client* можно использовать QObject* или QVariant с соответствующим приведением типов.

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

Воот! это уже ближе к тому, что хотелось. То есть Qt сам разрулит тип объекта, который я ему скормлю в свойство? Спасибо. Приду - попробую.

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

Похоже работает и как раз как надо.

Еще вопрос: Как сделать свойство 'client' обязательным? Чтоб не проверять в каждом вызове наличие клиента. Можно ли вызов слотов привязать к наличию этого поля?

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

Вроде была такая возможность, но сам никогда не пользовался. Если property можно изменить, то оно всегда может обнулиться. Сам всегда проверяю в каждом слоте правильно ли инициализирован обьект.

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

Oke. У меня они наследники от интерфейса, просто сделаю реализацию, которая будет кидать исключения.

А теперь о главном. Как в объекты параметры передавать? То есть те параметры, которые не должны светиться в QML.

например так:

my_root root;

qmlRegisterType<Type1>( ... );
qmlRegisterType<Type2>( ... );
qmlRegisterType<Type3>( ... );

Есть ли возможность, чтоб при создании объекта типа TypeX в QML каждый из них получал указатель на root?

синглтон кажется довольно костыльным вариантом...поиск объекта - не вариант. Объектов может быть не один и они не обязательно будут в корне QML.

ossa ★★
() автор топика
Последнее исправление: ossa (всего исправлений: 1)
Ответ на: комментарий от Dendy

хм. Что-то пока не соображу, как он мне поможет. Объекты создаются из QML, а контекст, судя по доке, должен быть привязан уже к готовому объекту.

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

Контекст определяет пространство имён. Не контекст привязан к обьекту, а обьект к контексту и обьект имеет доступ к параметрам контекста и параметрам всех его родительских контекстов. myQmlEngine->rootContext()->setContextProperty(«myRoot», root). После этого myRoot будет доступен в QML.

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

аа понял.

http://qt-project.org/doc/qt-5/qtqml-cppintegration-contextproperties.html

то есть я устанавливаю некое свойство, а потом прибиваю к каждому объекту руками данные? :-/ как-то это задом-наперед все.

Ладно пока так сделаю, спасибо =)

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