Search code examples
qtqmlapplicationwindow

How to get the className of activeFocusControl in QML ApplicationWindow


I try

ApplicationWindow {
    onActiveFocusControlChanged: {
    console.log(activeFocusControl)
    console.log(activeFocusControl.objectName)
    }
}

ouput:

qml: QQuickTextField(0xa6ec00)    //the 'activeFocusControl'
qml:                              //the 'activeFocusControl.objectName'
qml: QQuickButton(0xd7ccb0)
qml:

I want to

onActiveFocusControlChanged: {
    if (activeFocusControl.className == "QQuickTextField") {
        //do something
    }
    else if (activeFocusControl.className == "QQuickButton") {
        //do something
    }

but the "className" method does not exist so how i can do it?

sorry, my english is pool, and thank you


Solution

  • There is no method to access the className from qml, so a possible solution is to create a helper from c ++ as shown below:

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QQmlContext>
    
    #include <QObject>
    
    class Helper : public QObject
    {
        Q_OBJECT
    public:
        Q_INVOKABLE QString getClassName(QObject *obj) const{
               return obj? obj->metaObject()->className(): "";
        }
    };
    
    #include "main.moc"
    
    int main(int argc, char *argv[])
    {
    #if defined(Q_OS_WIN)
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
    
        QGuiApplication app(argc, argv);
    
        Helper helper;
    
        QQmlApplicationEngine engine;
        engine.rootContext()->setContextProperty("helper", &helper);
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    

    then it is used on the QML side:

    import QtQuick 2.9
    import QtQuick.Window 2.2
    import QtQuick.Controls 2.3
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        Button {
            id: button
            x: 270
            y: 47
            text: qsTr("Button")
        }
    
        TextField {
            id: textField
            x: 220
            y: 169
            text: qsTr("Text Field")
        }
    
        onActiveFocusControlChanged:  {
            var className = helper.getClassName(activeFocusControl)
            switch(className){
            case "QQuickTextField":
                console.log("I am QQuickTextField")
                break
            case "QQuickButton":
                console.log("I am QQuickButton")
                break
            default:
                console.log("empty")
            }
        }
    }
    

    The complete example can be found at the following link.