QQmlListProperty :为什么以下getter函数有效?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QQmlListProperty :为什么以下getter函数有效?相关的知识,希望对你有一定的参考价值。

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

我不理解chartitem.cpp文件中的这个getter函数(没有引用chartitem.h文件中的私有m_bars):

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

有人可以在推理中解释我的错误吗?先感谢您。

答案

看看public membersQQmlListProperty。唯一可以让你观察数据的是operator==。因此,数据不存在并不重要,因为没有人可以观察到它的存在。

据推测,你可以用bars做的唯一事情就是在底层的ChartItem中添加元素(通过一些QML魔法),因为这是唯一提供的操作。从某种意义上说,它是一个只写属性

以上是关于QQmlListProperty :为什么以下getter函数有效?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中编辑 QQmlListProperty

Qml中的“无效的属性分配:..只读属性”

正规文法与正规式

正规文法与正规式

汇编Mov+bx,15ge1111b是什么意思?

DPDK转发