1

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

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

4

1 回答 1

1

看看公众号成员QQmlListProperty。唯一可以让您观察数据的是operator==. 所以数据不存在并不重要,因为没有人可以观察到它的缺失。

大概你唯一能做的bars就是向底层添加元素ChartItem(通过一些 QML 魔法),因为这是提供的唯一操作。因此在某种意义上它是一个只写属性

于 2017-12-19T12:07:15.550 回答