動作確認環境:Qt 4.8.1 / Qt Creator 2.4.1 / Windows XP
QMLアプリケーションにおけるQMLとC++のコードの連携方法について見ていく。
今回は、例としてQMLからWindowsAPIのBeep()関数を呼び出してみる。
まずは、QMLから呼び出されるC++クラスの作成から始める。
QMLプロジェクト内にC++のソースを追加する。
追加するのは「Beeper」という名前の新規クラスで、QDeclarativeItemというQtのクラスを継承している。
QDeclarativeItemは、C++コードとQMLとの橋渡しをするための基本クラスである。
QMLから呼び出されるC++コードは全てこのQDeclarativeItemを継承していなければならない。
ソースコードは以下のようになる。
まずはヘッダファイルを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#ifndef BEEPER_H #define BEEPER_H #include <QDeclarativeItem> class Beeper : public QDeclarativeItem { Q_OBJECT public: explicit Beeper(QDeclarativeItem *parent = 0); Q_INVOKABLE void beep(int frequency, int duration ); signals: public slots: }; #endif // BEEPER_H |
12行目で、メソッドの冒頭にQ_INVOKABLEというマクロを記述している。
このようにすると、そのメソッドをQMLから呼び出せるようになる。
次に、実装ファイルを以下に示す。
1 2 3 4 5 6 7 8 9 10 11 12 |
#include "beeper.h" #include <windows.h> Beeper::Beeper(QDeclarativeItem *parent) : QDeclarativeItem(parent) { } void Beeper::beep(int frequency, int duration ) { Beep(frequency,duration); } |
WindowsAPIを使うので、冒頭で「windows.h」をインクルードしている。
9行目からの、先のヘッダファイルで宣言したbeep()メソッドの実装は、WindowsAPIのBeep()関数を呼び出しているだけである。
以上がQMLから呼び出されるC++クラスとなる。
さて、このクラスをQMLから使うには、もう一つ手順が必要である。
それは、ここで作ったC++クラスの型をQMLとして登録しなければならないということである。
そのためのコードはQtCreatorのプロジェクト生成時に作られている「main.cpp」に記述する。
その内容は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <QtGui/QApplication> #include "qmlapplicationviewer.h" #include "beeper.h" Q_DECL_EXPORT int main(int argc, char *argv[]) { QScopedPointer<QApplication> app(createApplication(argc, argv)); // QMLへの型の登録 qmlRegisterType<Beeper>("Sound",1,0,"Beeper"); QmlApplicationViewer viewer; viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); viewer.setMainQmlFile(QLatin1String("qml/QMLSandBox/main.qml")); viewer.showExpanded(); return app->exec(); } |
元からあった部分に追記したのは4行目と11行目である。
4行目で、先に作成したクラスのヘッダファイルをインクルードし、
11行目でqmlRegisterType()というQtのAPIを使い、型の登録を行っている。
メソッドの第1引数はQMLのimport文で指定する名前、第2引数と第3引数は登録する型のメジャーバージョンとマイナーバージョン、そして第4引数がQMLで使用するときの名前である。
それでは、このクラスをQMLから使ってみよう。
その前に、前回作成した「Button.qml」をプロジェクトに追加しておく。
メインのQMLは以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import QtQuick 1.1 import Sound 1.0 Rectangle { width: 360 height: 360 color : "lightblue" Beeper{ id:beeper } Button{ x:50; y:50 width: 100; height: 40 buttonColor: "green" onButtonClick: beeper.beep(440,100); } } |
2行目のインポート文でqmlRegisterType()で登録したときの名前とバージョンを記述しておく。
すると、QML内にクラスの名前を宣言するだけで、そのクラスのインスタンスが生成されることになる。
実際には10行目でBeeperのインスタンスを作成し、「beeper」というidを付けている。
そして18行目のボタンが押されたタイミングで、beep()メソッドを呼び出している。
アプリを起動し、ボタンを押すとBeep音が鳴る。
以上が、QMLとC++コードを連携させた例となる。