Q_PROPERTY로 등록한 프로퍼티는 변수처럼, 읽고, 쓸 수 있는 기능을 하는 것으로 생각을 하면, 클래스의 특정 함수를 QML에서 호출하는 것은 Q_INVOKABLE을 이용할 수 있습니다.
class MyObject : public QObject { Q_OBJECT public: explicit MyObject(QString n, QObject *parent = 0); Q_PROPERTY (QString myName READ getName WRITE setName NOTIFY nameChanged) QString getName(void) { return name; } void setName(QString n) { name = n; nameChanged();} Q_INVOKABLE QString getMyNameByMethod(QString param, int value) { qDebug() << __FUNCTION__ << " param:" << param << ", value:" << value; return name; } signals: void nameChanged(); public slots: private: QString name; }; |
위에 녹색으로 표시한 것이 일반 Public 함수를 QML에서 보이도록 Q_INVOKABLE로 만든 함수입니다.
이 함수는 Qt의 다른 클래스에서도 Public 함수로 호출을 할 수 있으며, 이 클래스가 QDeclarativeView의 rootContext에 Property로 등록이 되면, 이 함수를 QML에서 호출 할 수 있습니다.
즉, Qt/QML의 Meta system에서 Q_INVOKABLE로 선언된 함수를 등록을 해 두므로, QML에서 호출 할 수 있게 되는 것입니다.
QML에서는 어떻게 호출은 하는가.
아래에 Main함수에서 MyObject를 Property인 “myObject”로 등록을 했습니다.
DeclarativeView view; MyObject myObject("David Bae"); view.rootContext()->setContextProperty("myObject", &myObject); view.setSource(QUrl("../QLecture/qml/QLecture/main.qml")); view.show(); |
그리고 QML에서 myObject의 getMyNameByMethod함수를 호출할 수 있게 됩니다.
onClicked: { var name = myObject.getMyNameByMethod("nameFromQML", 50); console.log("[QML] getMyName:"+ name) idButtonText.text = name; } |
위와 같이 호출을 할 수 있게 되고, 파라미터를 넘기거나, 리턴값을 받아 올 수 있습니다.
댓글 없음:
댓글 쓰기