2017-12-27 1 views
0

QML ApplicationWindow에 activeFocusControl의 클래스를 얻는 방법 :내가</p> <pre><code>ApplicationWindow { onActiveFocusControlChanged: { console.log(activeFocusControl) console.log(activeFocusControl.objectName) } } </code></pre> <p>이 OUPUT 시도

내가

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

를 원하지만

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

은 "클래스 이름"방법은 존재하지 않습니다 그래서 어떻게 할 수 있습니까?

죄송합니다, 내 영어는 수영장, 당신에게 감사

+0

QML에서 클래스 이름을 가져올 방법이 없다는 것을 알고 있습니다. 그러나 대신 [objectName] (http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#accessing-loaded-qml-objects-by-object-name)을 사용할 수 있습니다. – folibis

답변

0

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

완전한 예를 찾을 수있는 다음에 link.