Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Converting object to string



  • What do I need to provide to be able to convert my object to a string in something like console.debug? At the moment, printing out my QObjectList gives me @KeyValue(0x196bdc0),KeyValue(0x18f8d40),KeyValue(0x18f90e0),KeyValue(0x1955d40)@
    I'd like to convert that to
    @KeyValue(0x196bdc0, Key="A", Value=1),KeyValue(0x18f8d40, Key="B", Value=2),KeyValue(0x18f90e0, Key="C", Value=3),KeyValue(0x1955d40, Key="D", Value=4)@


  • Moderators

    In QML and C++, I often add ::toString() method to various classes to make them print well and easy. You can probably do the same, although it's hard to be exact without seeing your code.



  • So is that an explicit call?
    In my example above I have a QObjectList model of KeyValue classes. Basically just pairs. The output I got was by doing
    @console.debug(model)@

    I'm guessing to produce something similar I'd have to loop and print item.toString then.

    Or to go off on a tangent I'm wondering if the javascript interpreter has some default stringify method that can be overridden similar to Rubys "inspect":http://ruby-doc.org/core-2.1.1/Object.html#method-i-inspect method


  • Moderators

    I'm no expert on JavaScript, sorry.

    Yes, your thinking on .tsoString() is correct.



  • If you need the toString-method only for quick debugging in QML you can use a JS loop to go though the object and print all properties with their values in most cases. or write a special function if you want to print only some properties of course.

    It sometimes sucks that JS only prints [Object object] for objects by default :D
    here my solution:
    @
    // register this function once
    Object.prototype.print = function() {
    for (var p in this) {
    var v = this[p]
    if (typeof v === "object")
    v.print()
    else if (typeof v !== "function")
    console.log(p, v)
    }
    }

    // instead of console.log(obj) use
    obj.print()
    @
    that will recursively print all properties with their values to the console. That is just a simple JS function, you can modify that to your liking and print what you want. :)

    of course you can also write a c++ function and call it from QML if you prefer that.



  • Best method for me:

    console.debug(JSON.stringify(yourObject));

    JSON global object is part of ES5(EcmaScript 5), it's in core JS functionality.



  • Is there an easy way to print QML object by JavaScript?

    The following code does not work, and no response after being executed.

    @
    import QtQuick 2.1
    import QtQuick.Controls 1.0

    ApplicationWindow {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }
    
    Text {
        id: mytext
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    
    Component.onCompleted: {
        console.debug(JSON.stringify(mytext))
    }
    

    }
    @



  • Happened here too. Probably you should submit a bug report.
    Doesn't happen to cpp exported object or js object


Log in to reply