QML入門のQMlとC++クラスの相互アクセス(一)
3460 ワード
Qt 5以降、QMLを導入し、以前はC++で開発されていたが、現在はQMLを見て公式文書をかじることを主とし、学習心得を記録している.
QMLとC++の相互作用は主に登録関数qmlRegisterTypeを用い、関数の原型は以下の通りである.
uriはQMLファイルでimportの場合の名前を表し、versionMajorとversionMinorはバージョン番号を表し、qmlNameはエクスポートするクラス名を表します.
例えばC++コードには次のように登録されています.
QMLでは次のように参照されます.
公式にはaddingの例が提供されていますが、ここでは公式の例を説明します.
例の構成は以下の通りである:Personクラス、proファイル、main.cppファイルとqmlファイル
1. まずproファイルにqmlサポートを追加
2. PersonクラスでQ_を使うPROPERTYは、QMLアクセスのために属性nameとshoeSizeをエクスポートします.
3.main.cppにPersonクラスを登録する
次にqmlにPersonをインポート
最後はmain.cppでexampleにアクセスします.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