如何在QML ApplicationWindow中获取activeFocusControl的className

时间:2017-12-27 08:11:55

标签: qt qml applicationwindow

我试试

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

输出:

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 个答案:

答案 0 :(得分:0)

没有方法可以从qml访问className,所以可能的解决方案是从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")
        }
    }
}

完整示例可在以下link找到。