QML入門のQMlとC++クラスの相互アクセス(一)

3460 ワード

Qt 5以降、QMLを導入し、以前はC++で開発されていたが、現在はQMLを見て公式文書をかじることを主とし、学習心得を記録している.
QMLとC++の相互作用は主に登録関数qmlRegisterTypeを用い、関数の原型は以下の通りである.
  template
  int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

  template
  int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

uriはQMLファイルでimportの場合の名前を表し、versionMajorとversionMinorはバージョン番号を表し、qmlNameはエクスポートするクラス名を表します.
例えばC++コードには次のように登録されています.
int main(int argc, char *argv[])
{
    // ...
    qmlRegisterType("qmlcomponents", 1, 0, "Slider");
    // ...
}

QMLでは次のように参照されます.
  //example.qml
  import qmlcomponents 1.0

  Slider {
      // ...
  }

公式にはaddingの例が提供されていますが、ここでは公式の例を説明します.
例の構成は以下の通りである:Personクラス、proファイル、main.cppファイルとqmlファイル
    1. まずproファイルにqmlサポートを追加
QT = core qml

SOURCES += main.cpp \
           person.cpp
HEADERS += person.h
RESOURCES += adding.qrc

target.path = $$[QT_INSTALL_EXAMPLES]/qml/referenceexamples/adding
INSTALLS += target

    2. PersonクラスでQ_を使うPROPERTYは、QMLアクセスのために属性nameとshoeSizeをエクスポートします.
//Person.h
#ifndef PERSON_H
#define PERSON_H

#include 

class Person : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)
public:
    Person(QObject *parent = 0);

    QString name() const;
    void setName(const QString &);

    int shoeSize() const;
    void setShoeSize(int);

private:
    QString m_name;
    int m_shoeSize;
};
#endif
// Person.cpp
#include "person.h"

Person::Person(QObject *parent)
: QObject(parent), m_shoeSize(0)
{
}

QString Person::name() const
{
    return m_name;
}

void Person::setName(const QString &n)
{
    m_name = n;
}

int Person::shoeSize() const
{
    return m_shoeSize;
}

void Person::setShoeSize(int s)
{
    m_shoeSize = s;
}

3.main.cppにPersonクラスを登録する
qmlRegisterType("People", 1,0, "Person");

次にqmlにPersonをインポート
// example.qml
import People 1.0

Person {
    name: "Bob Jones"
    shoeSize: 12
}

最後はmain.cppでexampleにアクセスします.qmlのプロパティ値
// main.cpp
#include 
#include 
#include 
#include 
#include "person.h"

int main(int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
    //  Person 
    qmlRegisterType("People", 1,0, "Person");

    //   qml
    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl("qrc:example.qml"));
    Person *person = qobject_cast(component.create());
    if (person) {
        qWarning() << "The person's name is" << person->name();
        qWarning() << "They wear a" << person->shoeSize() << "sized shoe";
    } else {
        qWarning() << component.errors();
    }

    return 0;
}

プログラムの実行結果は次のとおりです.
The person's name is "Bob Jones"
They wear a 12 sized shoe