Как получить className activeFocusControl в QML ApplicationWindow

Я попробую

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

Ouput:

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

я бы хотел

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

но метод "className" не существует, так как я могу это сделать?

извините, мой английский это пул, и спасибо

1 ответ

Решение

Нет метода для доступа к className из qml, поэтому возможное решение - создать помощника из C++, как показано ниже:

#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();
}

затем он используется на стороне QML:

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

Полный пример можно найти по следующей ссылке.

Другие вопросы по тегам