Gibt es eine Möglichkeit, alle Objektmitglieder/Eigenschaften in QML & Qt 5.1 aufzulisten?
Sowie:
var obj=myQObject;
console.log(obj)
// expected output:
// obj { x:123..... }
Dies wäre sehr hilfreich beim Debuggen.
Gerade Javascript bietet, was Sie suchen:
JSON.stringify(anything)
Es funktioniert für QML-Objekte wie Rechteck und auch für die meisten Objekte!
Mit Metaobjekten können Sie alle Eigenschaften einer beliebigen QML obj
(d. H. QQuickItem ) debuggen.
Sie benötigen etwas C++, um das Metaobjekt einer QML-Komponente abzurufen und Eigenschaftsnamen und -werte als Text in QML abzurufen.
Zuerst erstellen Sie eine QMLDebugger
-Klasse in C++ mit einer properties
-Methode:
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;
}
Diese Funktion kann statisch oder instanziierbar sein, spielt keine Rolle. Der Export statischer Methoden von C++ nach QML wird von QML sowieso nicht unterstützt. Ich benutze den Header:
public:
Q_INVOKABLE static QString properties(QQuickItem *item, bool linebreak = true);
Nun exportieren Sie die Klasse nach QML. In dir main.cpp
hinzufügen
#include "qmldebugger.h"
und
qmlRegisterType<QMLDebugger>("MyDemoLibrary", 1, 0, "QMLDebugger");
Erstellen Sie in Ihrer QML-Datei Ihre neue Bibliothek, erstellen Sie eine Instanz von QMLDebugger und beginnen Sie mit dem Debuggen:
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));
}
}
Der vollständige Quellcode ist als minimales Qt Creator-Projekt verfügbar unter: https://github.com/webmaster128/QMLDebugger
Konvertieren Sie einfach die QML/C++ - Komponente/das Objekt in ein JavaScript-Var-Objekt und verwenden Sie die for-each-Syntax, um alle Eigenschaften aufzulisten:
function listProperty(item)
{
for (var p in item)
console.log(p + ": " + item[p]);
}
in Ihrer QML-Datei einfach anrufen
onClicked:
{
listProperty(ItemID)
//or with this to list self properties
listProperty(this)
}
wenn jemand nur Eigenschaften eines Objekts auflisten möchte, keine Signale oder Slots, können Sie diese verwenden
function listProperty(item)
{
for (var p in item)
{
if( typeof item[p] != "function" )
if(p != "objectName")
console.log(p + ":" + item[p]);
}
}
Wenn Sie nicht nur am Debuggen von Konsolen interessiert sind, gibt es ein Programm namens GammaRay von KDAB ( link ), mit dem Sie alle Eigenschaften während der Laufzeit eines auf QWidgets oder QtQuick basierenden Programms prüfen und ändern können. Ziemlich ordentlich!
Ich habe noch keine Lösung gefunden, um alle Eigenschaften zu durchlaufen. Aber vielleicht hilft Ihnen das als erster Schritt.
Für jeden Quick Item können Sie die Eigenschaften von Item
ausdrucken:
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));
}
Ausgabe:
{'activeFocus': false, 'activeFocusOnTab': false, 'anchors.alignWhenCentered': true, 'anchors.baseline': QVariant (QQuickAnchorLine), 'anchors.baselineOffset': 0, 'anchors.bottom': QVariant (QQuickAnchorLore) , 'anchors.bottomMargin': 0, 'anchors.centerIn': QQuickRectangle_QML_0 (0x29857d0), 'anchors.fill': null, 'anchors.horizontalCenter': QVariant (QQuickAnchorLine), 'anchors.horizontalCorach'. left ': QVariant (QQuickAnchorLine),' anchors.leftMargin ': 0,' anchors.margins ': 0,' anchors.right ': QVariant (QQuickAnchorLine),' anchors.rightMargin ': 0,' anchors.top ': 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], ' aktiviert ': wahr,' Fokus ': falsch,' Höhe ': 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,}