Эффективная передача QList из C++ в QML с помощью привязок свойств и синтаксиса массива.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Эффективная передача QList из C++ в QML с помощью привязок свойств и синтаксиса массива.

Сообщение Anonymous »

Предположим, у меня есть объект C++ с именем MyCppComponent, который принимает входные данные из QML и выводит массив QString. Схема выглядит так, сначала назначение:

Код: Выделить всё

MyCppComponent {
id: myCppComponent
input: dataFromAnotherQmlComponent // will change
}
Repeater {
model: myCppComponent.count
MyQmlComponent {
data: myCppComponent.output[index] // must follow input changes
}
}
а затем часть C++:

Код: Выделить всё

class MyCppComponent : public QObject
{
...
Q_PROPERTY(int count ...
Q_PROPERTY(some_type input ... WRITE setInput ...
Q_PROPERTY(QStringList output ... NOTIFY outputChanged ...
...
signals:
void outputChanged();
...
void setInput(...)
{
...
emit outputChanged();
}
}
Это действительно работает (очевидно, это не рабочий код, а его суть); Мне нравится синтаксис индексации массива в QML (оператор []), но больше всего мне нравится то, что существуют привязки myCppComponent.input к dataFromAnotherQmlComponent и MyQmlComponent.data к myCppComponent.output, поэтому при изменении dataFromAnotherQmlComponent все автоматически обновляется.
Что мне в этом не нравится, так это то, что AFAIK, весь массив передается из C++ в QML по значению каждый раз, когда осуществляется доступ к элементу вывода, и обойти это невозможно. Что, если массив достаточно велик, чтобы вызывать беспокойство? Я мог бы сделать вывод функцией вместо свойства следующим образом:

Код: Выделить всё

class MyCppComponent : public QObject
{
...
Q_PROPERTY(some_type input ... WRITE setInput ...
Q_INVOKABLE QString output(int index)
{
return ...;
}
}
и соответствующий QML:

Код: Выделить всё

    MyQmlComponent {
data: myCppComponent.output(index)
}
и в этом случае код QML будет получать элементы один за другим, когда они ему понадобятся. Однако я теряю привязку и автоматическое обновление.
Итак, вопросы:
  • Правильно ли я понимаю, что QList передается по значению независимо от его размера (т. е. нет копирования при записи или что-то в этом роде), Q_PROPERTY поддерживает изменения уведомлений, а Q_INVOKABLE нет?
  • Что бы вы сделали, если бы хотели а) автоматические обновления через привязки и б) синтаксис, подобный массиву []? Если что-то и должно быть сделано, так это синтаксис. Я понимаю, что могу создать свой собственный сигнал обновления и обрабатывать изменения в блоках on...Changed, но это отнимает все удовольствие.


Подробнее здесь: https://stackoverflow.com/questions/798 ... rray-synta
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»