2012년 6월 16일 토요일

[QML/Qt] Lecture 03. QML에서 Qt Class의 Method를 호출하자.

Lecture 02.에서 만든 환경을 그대로 이용해서, QML에서 Qt Class의 메소드를 호출하는 방법을 알아봅니다.

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;
   }


위와 같이 호출을 할 수 있게 되고, 파라미터를 넘기거나, 리턴값을 받아 올 수 있습니다.