tamaƱo recorrer propiedades obtener objetos objeto literales lista imprimir atributos array qt qml qt5 qtquick2

qt - propiedades - recorrer array de objetos javascript



QML: Listar todos los objetos objeto/propiedades en la consola (6)

Con los meta objetos, puede depurar todas las propiedades de cualquier objeto QML (es decir, QQuickItem ).

Necesita algo de C ++ para obtener el metaobjeto de un componente QML y recuperar nombres y valores de propiedades como texto en QML.

Primero crea una clase QMLDebugger en C ++ con un método de properties :

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; }

Esta función puede ser estática o ejemplificable, no importa. QML no admite la exportación de métodos estáticos de C ++ a QML de todos modos. Yo uso el encabezado:

public: Q_INVOKABLE static QString properties(QQuickItem *item, bool linebreak = true);

Ahora usted exporta la clase a QML. En tu main.cpp agregar

#include "qmldebugger.h"

y

qmlRegisterType<QMLDebugger>("MyDemoLibrary", 1, 0, "QMLDebugger");

En su archivo QML, importe su nueva biblioteca, cree una instancia de QMLDebugger y comience la depuración feliz:

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)); } }

El código fuente completo está disponible como un proyecto de Qt Creator mínimo en: https://github.com/webmaster128/QMLDebugger

¿Hay alguna forma de enumerar todos los miembros / propiedades del objeto en QML y Qt 5.1?

Como:

var obj=myQObject; console.log(obj) // expected output: // obj { x:123..... }

Esto sería muy útil para la depuración.


En caso de que alguien quiera enumerar solo las propiedades de un objeto, no hay señales ni ranuras, puede usar este

function listProperty(item) { for (var p in item) { if( typeof item[p] != "function" ) if(p != "objectName") console.log(p + ":" + item[p]); } }


No vi una solución para iterar todas las propiedades todavía. Pero tal vez esto te ayude como primer paso.

Para cada artículo rápido puede imprimir las propiedades del 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)); }

Salida:

{''activeFocus'': false, ''activeFocusOnTab'': false, ''anchors.alignWhenCentered'': true, ''anchors.baseline'': QVariant (QQuickAnchorLine), ''anchors.baselineOffset'': 0, ''anchors.bottom'': QVariant (QQuickAnchorine , ''anchors.bottomMargin'': 0, ''anchors.centerIn'': QQuickRectangle_QML_0 (0x29857d0), ''anchors.fill'': null, ''anchors.horizontalCenterCententsCententsCententsCenter.com 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'': objeto objeto ], ''childrenRect.height'': 0, ''childrenRect.width'': 0, ''childrenRect.x'': 0, ''childrenRect.y'': 0, ''clip'': false, ''data'': [object Object], '' habilitado '': verdadero,'' enfocar '': falso,'' altura '': 17,'' implicitHeight '': 17,'' implicitWidth '': 80.5625,'' layer.effect '': null,'' layer.enabled '': false,'' layer.format '': 6408,'' layer.mipmap '': false,'' layer.samplerName '': source,'' layer.smooth '' : falso, ''layer.sourceRect'': QRectF (0, 0, 0, 0), ''layer.textureSize'': QSize (-1, -1), ''layer.wrapMode'': 0, ''opacity'': 1, '' padre '': QQuickRectangle_QML_0 (0x29857d0),'' recursos '': [Objeto objeto],'' rotación '': 0,'' escala '': 1,'' suave '': verdadero,'' estado '':,'' estados '': [objeto Objeto],'' transform '': [objeto Object],'' transformOrigin '': 4,'' transitions '': [Object Object],'' visible '': true,'' visibleChildren '': [Object Object],'' width '': 80.5625,'' x '': 139.71875, ''y'': 171, ''z'': 0,}


Si no solo está interesado en la depuración de la consola, hay un programa llamado GammaRay by KDAB ( link ) que le permite realizar una introspección y cambiar todas las propiedades durante el tiempo de ejecución de un programa basado en QWidgets o QtQuick. ¡Con buena pinta!


Simplemente convierta el componente / objeto QML / C ++ en el objeto var de JavaScript y use la sintaxis for-each para enumerar todas las propiedades:

function listProperty(item) { for (var p in item) console.log(p + ": " + item[p]); }

en su archivo QML, solo llame

onClicked: { listProperty(ItemID) //or with this to list self properties listProperty(this) }


Straight javascript ofrece lo que buscas:

JSON.stringify(anything)

Funciona en elementos QML como Rectangle, y también funciona en la mayoría de los objetos arbitrarios.

Convertir un objeto en una cadena