webentwicklung-frage-antwort-db.com.de

QML: Listet alle Objektelemente/Eigenschaften in der Konsole auf

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.

22
tirth

Gerade Javascript bietet, was Sie suchen:

JSON.stringify(anything)

Es funktioniert für QML-Objekte wie Rechteck und auch für die meisten Objekte!

Ein Objekt in einen String konvertieren

18
kevinf

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

11
Simon Warta

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

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

}
2
Yasser Sobhy

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!

1
at-2500

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

0
Simon Warta