我是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 members的QQmlListProperty
。唯一可以让你观察数据的是operator==
。因此,数据不存在并不重要,因为没有人可以观察到它的存在。
据推测,你可以用bars
做的唯一事情就是在底层的ChartItem
中添加元素(通过一些QML魔法),因为这是唯一提供的操作。从某种意义上说,它是一个只写属性