外部ライブラリをQtに取り込むには
How to import native libraries on Qt
QtはC++がベースの開発環境であり、また、基本的にプラットフォーム標準のコンパイラ(WindowsならMSVC、Androidならgcc)でアプリを生成するため、ラッパーコードなどを必要とせず、C言語ライブラリーをそのままプログラムに取り入れることができます。
これらはQtプロジェクトファイル(.pro)で定義することになります。「$$」はqmakeマクロを意味しています。この場合であれば、プロジェクトファイルのあるディレクトリの「opencv」フォルダーがインクルードフォルダーに追加されます。
INCLUDEPATH += $$_PRO_FILE_PWD_/opencv/
Cプリプロセッサを定義するには「DEFINES」に文字列を追加します。
DEFINES += PARAM_SINGLE_ONLY
ライブラリーディレクトリを定義するには「LIBS」を記入します。ただし、記述方法はコンパイラに依存するため、プラットフォームごとにパラメータを変更しなくてはいけません。
LIB_DIR = $$_PRO_FILE_PWD_/libav/$${QMAKE_HOST.os}/$${QMAKE_HOST.arch}
android{
LIBS += -L"$$LIB_DIR" -lavformat-57
}
winrt{
LIBS += "$$LIB_DIR\avformat.lib"
}
以上を踏まえて、GPIOコントローラーライブラリ「wiringPi」使ってRaspberry Piで動作するQtアプリでLチカを試してみましょう。新規プロジェクトを作成したら、「LIBS += -lwiringPi」の一文を追加します。
main.qmlファイルにボタンを追加し、ボタンを押したり離したりした際にシグナルを発生させます。
main.qml
import QtQuick 2.9
import QtQuick.Controls 2.0
Item {
signal ledOn()
signal ledOff()
Button{
text:"LED"
onPressed: ledOn()
onReleased: ledOff()
}
}
wiringPiのQtでの使い方は、コンソールアプリにおけるC言語プログラミングと全く同じです。
mainview.h
#ifndef MAINVIEW_H
#define MAINVIEW_H
#include <QQuickView>
class MainView : public QQuickView
{
Q_OBJECT
public:
MainView();
public slots:
void onLedOn();
void onLedOff();
};
#endif
mainview.cpp
#include "mainview.h"
#include "wiringPi.h"
#include <QQuickItem>
#define GPIO_LED 17
MainView::MainView()
{
setResizeMode(QQuickView::SizeRootObjectToView);
setSource(QUrl("qrc:/main.qml"));
QObject *root = this->rootObject();
connect(root, SIGNAL(ledOn()), this, SLOT(onLedOn()));
connect(root, SIGNAL(ledOff()), this, SLOT(onLedOff()));
wiringPiSetupGpio();
pinMode(GPIO_LED, OUTPUT);
}
void MainView::onLedOn()
{
digitalWrite(GPIO_LED, 1);
}
void MainView::onLedOff()
{
digitalWrite(GPIO_LED, 0);
}
このプログラム例では、Qtアプリに表示されたボタンを押すと、GPIO17がオンに、離すとオフになります。
2018/11/10