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.