C++ qqmlistproperty<;T>;:为什么下面的getter函数可以工作?

C++ qqmlistproperty<;T>;:为什么下面的getter函数可以工作?,c++,qml,qqmllistproperty,C++,Qml,Qqmllistproperty,我是qml的新手,很难理解使用QQmlListProperty的示例代码: 我不理解chartitem.cpp文件中的这个getter函数(在chartitem.h文件中没有任何对私有m_条的引用): qqmlistProperty ChartItem::bars() { 返回qqmlistproperty(this,0, &ChartItem::附加_条,0,0,0); //m_bars的参考号在哪里? } 将返回哪些数据?没有对应包含返回数据的专用Qlist m_条的引用 下面是头文件和实

我是qml的新手,很难理解使用QQmlListProperty的示例代码:

我不理解chartitem.cpp文件中的这个getter函数(在chartitem.h文件中没有任何对私有m_条的引用):

qqmlistProperty ChartItem::bars()
{
返回qqmlistproperty(this,0,
&ChartItem::附加_条,0,0,0);
//m_bars的参考号在哪里?
}
将返回哪些数据?没有对应包含返回数据的
专用Qlist m_条的引用

下面是头文件和实现文件的重要代码片段

/*---------- 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();
}
...
/*-----------------------------------------*/
/*------------chartitem.h文件:-----------*/
类别图表项:公共QQuickPaintedItem
{
Q_对象
Q_属性(QQmlListProperty bars读取bars通知barsChanged)
公众:
ChartItem(QQuickItem*父项=0);
空漆(QPainter*油漆工);
qqmlistproperty条();
...
Q_信号:
void barsChanged();
私人:
静态无效附加条(qqmlistproperty*list,BarItem*bar);
qlistmu条;
...
}
/*-----------------------------------------*/
/*-------------chartitem.cpp文件--------*/
...
QQmlListProperty ChartItem::bars()
{
返回qqmlistproperty(this,0,
&ChartItem::附加_条,0,0,0);
//m_bars的参考号在哪里?
}
void ChartItem::append_bar(QQmlListProperty*列表,BarItem*栏)
{
ChartItem*chart=qobject\u cast(列表->对象);
如果(图表){
条形->设置父对象(图表);
图表->m_条。追加(条);
图表->条形图();
}
...
/*-----------------------------------------*/
有人能解释我的推理错误吗? 提前谢谢。

请查看
qqmlistproperty
的属性。唯一允许您观察数据的是
操作符==
。因此数据不存在并不重要,因为没有人可以观察到它的缺失

大概您可以使用
做的唯一一件事就是将元素添加到基础
图表项
(通过一些QML魔术),因为这是提供的唯一操作。从某种意义上说,它是一个只写属性

/*---------- 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();
}
...
/*-----------------------------------------*/