Код: Выделить всё
MyCppComponent {
id: myCppComponent
input: dataFromAnotherQmlComponent // will change
}
Repeater {
model: myCppComponent.count
MyQmlComponent {
data: myCppComponent.output[index] // must follow input changes
}
}
Код: Выделить всё
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();
}
}
Что мне в этом не нравится, так это то, что AFAIK, весь массив передается из C++ в QML по значению каждый раз, когда осуществляется доступ к элементу вывода, и обойти это невозможно. Что, если массив достаточно велик, чтобы вызывать беспокойство? Я мог бы сделать вывод функцией вместо свойства следующим образом:
Код: Выделить всё
class MyCppComponent : public QObject
{
...
Q_PROPERTY(some_type input ... WRITE setInput ...
Q_INVOKABLE QString output(int index)
{
return ...;
}
}
Код: Выделить всё
MyQmlComponent {
data: myCppComponent.output(index)
}
Итак, вопросы:
- Правильно ли я понимаю, что QList передается по значению независимо от его размера (т. е. нет копирования при записи или что-то в этом роде), Q_PROPERTY поддерживает изменения уведомлений, а Q_INVOKABLE нет?
- Что бы вы сделали, если бы хотели а) автоматические обновления через привязки и б) синтаксис, подобный массиву []? Если что-то и должно быть сделано, так это синтаксис. Я понимаю, что могу создать свой собственный сигнал обновления и обрабатывать изменения в блоках on...Changed, но это отнимает все удовольствие.
Подробнее здесь: https://stackoverflow.com/questions/798 ... rray-synta
Мобильная версия