QQmlListProperty<T>: Почему работает следующая функция получения?
Я новичок в qml и испытываю трудности с пониманием примера кода для использования QQmlListProperty:
Я не понимаю эту функцию получения в файле chartitem.cpp (без ссылки на приватные m_bars в файле chartitem.h):
QQmlListProperty<BarItem> ChartItem::bars()
{
return QQmlListProperty<BarItem>(this, 0,
&ChartItem::append_bar,0, 0, 0);
// where is the reference to m_bars ?
}
Какие данные будут возвращены? Там нет ссылки на private Qlist<BarItem*> m_bars
который должен содержать возвращенные данные.
Вот важные фрагменты кода заголовочных файлов и файлов реализации...
/*---------- chartitem.h file : -----------*/
class ChartItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<BarItem> bars READ bars NOTIFY barsChanged)
public:
ChartItem(QQuickItem *parent = 0);
void paint(QPainter *painter);
QQmlListProperty<BarItem> bars();
...
Q_SIGNALS:
void barsChanged();
private:
static void append_bar(QQmlListProperty<BarItem> *list, BarItem *bar);
QList<BarItem*> m_bars;
...
}
/*-----------------------------------------*/
/*------------- chartitem.cpp file --------*/
...
QQmlListProperty<BarItem> ChartItem::bars()
{
return QQmlListProperty<BarItem>(this, 0,
&ChartItem::append_bar,0, 0, 0);
// where is the reference to m_bars ?
}
void ChartItem::append_bar(QQmlListProperty<BarItem> *list, BarItem *bar)
{
ChartItem *chart = qobject_cast<ChartItem *>(list->object);
if (chart) {
bar->setParent(chart);
chart->m_bars.append(bar);
chart->barsChanged();
}
...
/*-----------------------------------------*/
Может кто-нибудь объяснить мою ошибку в рассуждениях? Заранее спасибо.
1 ответ
Посмотрите на общественных членов QQmlListProperty
, Единственное, что позволит вам наблюдать за данными, это operator==
, Поэтому не имеет значения, что данные отсутствуют, потому что никто не может наблюдать их отсутствие.
Предположительно единственное, что вы можете сделать с bars
это добавить элементы в базовый ChartItem
(некоторым волшебством QML), потому что это единственная предоставленная операция. Таким образом, в некотором смысле это свойство только для записи