Strange bug/quirk with QObject's dumpObjectTree()
-
Hello all,
Was not sure if I should post this here or in the QML section, but I encountered something strange while exploring the object tree of a QObject.Essentially, I create a QQmlComponent from my qml file that holds all my formatting. I then create a QObject pointer object from this component. The purpose of this is so I can dig through its object tree to find a LineSeries embedded within a ChartView delegate, allowing me to link data refresh signals with new data points being added to my graph.
What's strange, is that when I grab the ListView from the object tree (it is title "chartListView") and dump its object tree, I see another QObject titled "chartListView" in its object tree!! So either I am not doing something correctly, or I have discovered a bug.. I will post code below.
main.cpp:
QQmlComponent sumPage(&engine,QUrl("qrc:/Display0.qml")); QObject *summaryPage = sumPage.create(); //access to entire Display0.qml file graphList->setQMLReference(summaryPage);
setQMLReference method inside the graphList object:
void GraphModel::setQMLReference(QObject *comp) { QObject *ref = new QObject(); QObjectList *items = new QObjectList(comp->findChildren<QObject *>(QString())); for (int i = 0; i < items->length();i++) { if (items->at(i)->objectName().compare(QString("chartListView"),Qt::CaseSensitive)) { ref = items->at(i); qDebug() << "found it."; qDebug() << ref->metaObject()->className(); qDebug() << "obj tree: "; ref->dumpObjectTree(); qDebug() << "obj info: "; ref->dumpObjectInfo(); break; } } items = new QObjectList(ref->findChildren<QObject *>(QString())); for (int i = 0; i < items->length();i++) { qDebug() << items->at(i)->objectName(); qDebug() << items->at(i)->metaObject()->className(); } }
here is the ListView section of Display0.qml:
ListView { objectName: "chartListView" id: chartListView x: 0 y: 130 width: 350 height: 350 anchors.top: controlRect.bottom orientation: Qt.Vertical /* Procedure: -load a DataPiece in to GraphModel. (name, units, value, maximum, minimum) -Set up ChartView & LineSeries according to that DataPiece. */ model: graphModel.getSize() delegate: ChartView { objectName: "chartView" width: 350 height: 350 title: graphModel.getDataAt(index).getModuleName() + " " + graphModel.getDataAt(index).getName() + " vs. time" LineSeries { axisX: ValueAxis { objectName: "xAxis" color: "black" gridVisible: true labelsFont.pointSize: 5 titleFont.pointSize: 8 titleText: "time (s)" visible: true min: 0 } axisY: ValueAxis { min: graphModel.getDataAt(index).minimumAsInt() max: graphModel.getDataAt(index).maximumAsInt() objectName: "yAxis" color: "black" gridVisible: true labelsFont.pointSize: 5 titleFont.pointSize: 8 titleText: graphModel.getDataAt(index).getName() + " (" + graphModel.getDataAt(index).getUnits() + ")" visible: true } /*x vals come from this timer. When the first value change of the DataPiece is detected, x=0 is used for the first point, the timer is started, and timer values are used for x values from then on. */ Timer { id: objTimer objectName: graphModel.getDataAt(index).getName() + "Timer" } //must implement C++ logic to add data points here. } } }
Finally, some console output to show you what I am talking about:
found it. QQuickRectangle obj tree: QQuickRectangle:: QQuickSwipeView:: QQmlObjectModel:: QQuickListView:: QQuickItem:: QQuickItem:: QQuickItem:: QQuickRectangle::chartRect QQuickRectangle:: QQuickListView::chartListView QQuickItem:: QQuickItem:: QQmlComponent:: QQuickRectangle::rightRect QQuickListView:: QQuickItem:: QQuickText:: QQmlContext:: QQuickListViewAttached:: QQuickItem:: QQmlComponent:: QQmlComponent:: QQmlObjectModelAttached:: QQuickListViewAttached:: QQuickItem:: QQuickButton:: QQuickRectangle:: QQuickText:: QQmlObjectModelAttached:: QQuickListViewAttached:: QQuickPageIndicator:: QQuickRow:: QQuickRepeater:: QQmlComponent::
To recap, I have a LineSeries inside of a graph that I want to synchronize with data being fed into the system, with as quick of a refresh rate as possible. That being said, I am well aware that I may not be achieving my goal the most efficient way possible, and would be open to other suggestions.
But the main question is, why am I seeing "chartListView" inside the Object tree of "chartListView"?
-
Hello all,
Was not sure if I should post this here or in the QML section, but I encountered something strange while exploring the object tree of a QObject.Essentially, I create a QQmlComponent from my qml file that holds all my formatting. I then create a QObject pointer object from this component. The purpose of this is so I can dig through its object tree to find a LineSeries embedded within a ChartView delegate, allowing me to link data refresh signals with new data points being added to my graph.
What's strange, is that when I grab the ListView from the object tree (it is title "chartListView") and dump its object tree, I see another QObject titled "chartListView" in its object tree!! So either I am not doing something correctly, or I have discovered a bug.. I will post code below.
main.cpp:
QQmlComponent sumPage(&engine,QUrl("qrc:/Display0.qml")); QObject *summaryPage = sumPage.create(); //access to entire Display0.qml file graphList->setQMLReference(summaryPage);
setQMLReference method inside the graphList object:
void GraphModel::setQMLReference(QObject *comp) { QObject *ref = new QObject(); QObjectList *items = new QObjectList(comp->findChildren<QObject *>(QString())); for (int i = 0; i < items->length();i++) { if (items->at(i)->objectName().compare(QString("chartListView"),Qt::CaseSensitive)) { ref = items->at(i); qDebug() << "found it."; qDebug() << ref->metaObject()->className(); qDebug() << "obj tree: "; ref->dumpObjectTree(); qDebug() << "obj info: "; ref->dumpObjectInfo(); break; } } items = new QObjectList(ref->findChildren<QObject *>(QString())); for (int i = 0; i < items->length();i++) { qDebug() << items->at(i)->objectName(); qDebug() << items->at(i)->metaObject()->className(); } }
here is the ListView section of Display0.qml:
ListView { objectName: "chartListView" id: chartListView x: 0 y: 130 width: 350 height: 350 anchors.top: controlRect.bottom orientation: Qt.Vertical /* Procedure: -load a DataPiece in to GraphModel. (name, units, value, maximum, minimum) -Set up ChartView & LineSeries according to that DataPiece. */ model: graphModel.getSize() delegate: ChartView { objectName: "chartView" width: 350 height: 350 title: graphModel.getDataAt(index).getModuleName() + " " + graphModel.getDataAt(index).getName() + " vs. time" LineSeries { axisX: ValueAxis { objectName: "xAxis" color: "black" gridVisible: true labelsFont.pointSize: 5 titleFont.pointSize: 8 titleText: "time (s)" visible: true min: 0 } axisY: ValueAxis { min: graphModel.getDataAt(index).minimumAsInt() max: graphModel.getDataAt(index).maximumAsInt() objectName: "yAxis" color: "black" gridVisible: true labelsFont.pointSize: 5 titleFont.pointSize: 8 titleText: graphModel.getDataAt(index).getName() + " (" + graphModel.getDataAt(index).getUnits() + ")" visible: true } /*x vals come from this timer. When the first value change of the DataPiece is detected, x=0 is used for the first point, the timer is started, and timer values are used for x values from then on. */ Timer { id: objTimer objectName: graphModel.getDataAt(index).getName() + "Timer" } //must implement C++ logic to add data points here. } } }
Finally, some console output to show you what I am talking about:
found it. QQuickRectangle obj tree: QQuickRectangle:: QQuickSwipeView:: QQmlObjectModel:: QQuickListView:: QQuickItem:: QQuickItem:: QQuickItem:: QQuickRectangle::chartRect QQuickRectangle:: QQuickListView::chartListView QQuickItem:: QQuickItem:: QQmlComponent:: QQuickRectangle::rightRect QQuickListView:: QQuickItem:: QQuickText:: QQmlContext:: QQuickListViewAttached:: QQuickItem:: QQmlComponent:: QQmlComponent:: QQmlObjectModelAttached:: QQuickListViewAttached:: QQuickItem:: QQuickButton:: QQuickRectangle:: QQuickText:: QQmlObjectModelAttached:: QQuickListViewAttached:: QQuickPageIndicator:: QQuickRow:: QQuickRepeater:: QQmlComponent::
To recap, I have a LineSeries inside of a graph that I want to synchronize with data being fed into the system, with as quick of a refresh rate as possible. That being said, I am well aware that I may not be achieving my goal the most efficient way possible, and would be open to other suggestions.
But the main question is, why am I seeing "chartListView" inside the Object tree of "chartListView"?