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), потому что это единственная предоставленная операция. Таким образом, в некотором смысле это свойство только для записи

Другие вопросы по тегам