Is there any way to list all object members/properties in QML & Qt 5.1?
Such as:
var obj=myQObject;
console.log(obj)
// expected output:
// obj { x:123..... }
This would be very helpful for debugging.
Is there any way to list all object members/properties in QML & Qt 5.1?
Such as:
var obj=myQObject;
console.log(obj)
// expected output:
// obj { x:123..... }
This would be very helpful for debugging.
Straight javascript offers what you are looking for:
JSON.stringify(anything)
It works on QML items such as Rectangle, and it also works on most arbitrary objects!
With meta objects you can debug all properties of any QML obj
(i.e. QQuickItem).
You need some C++ to get the meta object of a QML component and get back property names and values as text in QML.
First you create a QMLDebugger
class in C++ with a properties
method:
QString QMLDebugger::properties(QQuickItem *item, bool linebreak)
{
const QMetaObject *meta = item->metaObject();
QHash<QString, QVariant> list;
for (int i = 0; i < meta->propertyCount(); i++)
{
QMetaProperty property = meta->property(i);
const char* name = property.name();
QVariant value = item->property(name);
list[name] = value;
}
QString out;
QHashIterator<QString, QVariant> i(list);
while (i.hasNext()) {
i.next();
if (!out.isEmpty())
{
out += ", ";
if (linebreak) out += "\n";
}
out.append(i.key());
out.append(": ");
out.append(i.value().toString());
}
return out;
}
This function can be static or instanceiable, doesn't matter. QML does not support exporting static methods from C++ to QML anyway. I use the header:
public:
Q_INVOKABLE static QString properties(QQuickItem *item, bool linebreak = true);
Now you export the class to QML. In you main.cpp
add
#include "qmldebugger.h"
and
qmlRegisterType<QMLDebugger>("MyDemoLibrary", 1, 0, "QMLDebugger");
In your QML file import you new library, create an instance of QMLDebugger and start happy debugging:
import QtQuick 2.0
import MyDemoLibrary 1.0
Rectangle {
id: mainRectangle
width: 360
height: 360
color: "silver"
Text {
id: textElement
color: "#d71f1f"
text: qsTr("Hello World")
font.bold: true
font.italic: true
font.underline: true
style: Text.Raised
horizontalAlignment: Text.AlignHCenter
font.pointSize: 16
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
}
QMLDebugger {
id: qmlDebugger
}
Component.onCompleted: {
console.log("Debug mainRectangle:");
console.log(qmlDebugger.properties(mainRectangle));
console.log("Debug textElement:");
console.log(qmlDebugger.properties(textElement, false));
}
}
The full source code is available as a minimal Qt Creator project on: https://github.com/webmaster128/QMLDebugger
Just convert the QML/C++ component/object into JavaScript var object, and use the for-each syntax to list all the property:
function listProperty(item)
{
for (var p in item)
console.log(p + ": " + item[p]);
}
in your QML file, just call
onClicked:
{
listProperty(ItemID)
//or with this to list self properties
listProperty(this)
}
in case of any one wants to list only properties of an object, no signals nor slots you can use this
function listProperty(item)
{
for (var p in item)
{
if( typeof item[p] != "function" )
if(p != "objectName")
console.log(p + ":" + item[p]);
}
}
I did not see a solution to iterate all properties yet. But maybe this helps you as a first step.
For every Quick Item you can print out the properties of Item
:
import QtQuick 2.0
Rectangle {
width: 360
height: 360
function debugQuickItem(object) {
var properties = {
'activeFocus': object.activeFocus,
'activeFocusOnTab': object.activeFocusOnTab,
'anchors.alignWhenCentered': object.anchors.alignWhenCentered,
'anchors.baseline': object.anchors.baseline,
'anchors.baselineOffset': object.anchors.baselineOffset,
'anchors.bottom': object.anchors.bottom,
'anchors.bottomMargin': object.anchors.bottomMargin,
'anchors.centerIn': object.anchors.centerIn,
'anchors.fill': object.anchors.fill,
'anchors.horizontalCenter': object.anchors.horizontalCenter,
'anchors.horizontalCenterOffset': object.anchors.horizontalCenterOffset,
'anchors.left': object.anchors.left,
'anchors.leftMargin': object.anchors.leftMargin,
'anchors.margins': object.anchors.margins,
'anchors.right': object.anchors.right,
'anchors.rightMargin': object.anchors.rightMargin,
'anchors.top': object.anchors.top,
'anchors.topMargin': object.anchors.topMargin,
'anchors.verticalCenter': object.anchors.verticalCenter,
'anchors.verticalCenterOffset': object.anchors.verticalCenterOffset,
'antialiasing': object.antialiasing,
'baselineOffset': object.baselineOffset,
'children': object.children,
'childrenRect.height': object.childrenRect.height,
'childrenRect.width': object.childrenRect.width,
'childrenRect.x': object.childrenRect.x,
'childrenRect.y': object.childrenRect.y,
'clip': object.clip,
'data': object.data,
'enabled': object.enabled,
'focus': object.focus,
'height': object.height,
'implicitHeight': object.implicitHeight,
'implicitWidth': object.implicitWidth,
'layer.effect': object.layer.effect,
'layer.enabled': object.layer.enabled,
'layer.format': object.layer.format,
'layer.mipmap': object.layer.mipmap,
'layer.samplerName': object.layer.samplerName,
'layer.smooth': object.layer.smooth,
'layer.sourceRect': object.layer.sourceRect,
'layer.textureSize': object.layer.textureSize,
'layer.wrapMode': object.layer.wrapMode,
'opacity': object.opacity,
'parent': object.parent,
'resources': object.resources,
'rotation': object.rotation,
'scale': object.scale,
'smooth': object.smooth,
'state': object.state,
'states': object.states,
'transform': object.transform,
'transformOrigin': object.transformOrigin,
'transitions': object.transitions,
'visible': object.visible,
'visibleChildren': object.visibleChildren,
'width': object.width,
'x': object.x,
'y': object.y,
'z': object.z,
}
var out = "{ "
for (var key in properties)
{
out += "'" + key + "': " + properties[key] + ", "
}
out += "}"
return out;
}
Text {
id: textObject
anchors.centerIn: parent
text: "Hello World"
}
Component.onCompleted: console.log(debugQuickItem(textObject));
}
Output:
{ 'activeFocus': false, 'activeFocusOnTab': false, 'anchors.alignWhenCentered': true, 'anchors.baseline': QVariant(QQuickAnchorLine), 'anchors.baselineOffset': 0, 'anchors.bottom': QVariant(QQuickAnchorLine), 'anchors.bottomMargin': 0, 'anchors.centerIn': QQuickRectangle_QML_0(0x29857d0), 'anchors.fill': null, 'anchors.horizontalCenter': QVariant(QQuickAnchorLine), 'anchors.horizontalCenterOffset': 0, 'anchors.left': QVariant(QQuickAnchorLine), 'anchors.leftMargin': 0, 'anchors.margins': 0, 'anchors.right': QVariant(QQuickAnchorLine), 'anchors.rightMargin': 0, 'anchors.top': QVariant(QQuickAnchorLine), 'anchors.topMargin': 0, 'anchors.verticalCenter': QVariant(QQuickAnchorLine), 'anchors.verticalCenterOffset': 0, 'antialiasing': false, 'baselineOffset': 14, 'children': [object Object], 'childrenRect.height': 0, 'childrenRect.width': 0, 'childrenRect.x': 0, 'childrenRect.y': 0, 'clip': false, 'data': [object Object], 'enabled': true, 'focus': false, 'height': 17, 'implicitHeight': 17, 'implicitWidth': 80.5625, 'layer.effect': null, 'layer.enabled': false, 'layer.format': 6408, 'layer.mipmap': false, 'layer.samplerName': source, 'layer.smooth': false, 'layer.sourceRect': QRectF(0, 0, 0, 0), 'layer.textureSize': QSize(-1, -1), 'layer.wrapMode': 0, 'opacity': 1, 'parent': QQuickRectangle_QML_0(0x29857d0), 'resources': [object Object], 'rotation': 0, 'scale': 1, 'smooth': true, 'state': , 'states': [object Object], 'transform': [object Object], 'transformOrigin': 4, 'transitions': [object Object], 'visible': true, 'visibleChildren': [object Object], 'width': 80.5625, 'x': 139.71875, 'y': 171, 'z': 0, }