MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
QMLの基礎 - ライブラリのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
QMLの基礎 - ライブラリ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Qt Creatorにおいて、QMLを使用した静的ライブラリおよび動的ライブラリを作成して、他のQtプロジェクトにリンクする手順を記載する。<br> <br><br> == 動的ライブラリ == ==== 動的ライブラリの作成 ==== # QT Creatorのメイン画面から、[ファイル]メニューバー - [ファイル / プロジェクトの新規作成]を選択する。 # [新しいファイルまたはプロジェクト]画面左にある[ライブラリ]から[C++ Library]を選択する。 # [C++ Library]画面が開くので、以下の項目を設定する。 #* プロジェクト名やビルドシステム等を任意のものに設定する。 #* [プロジェクトの詳細定義]では、以下の手順で設定する。 #*: [Type:]は、[Shared Library] #*: [Qt module:]は、Qtクラスを使用しない場合は[None]、Qtクラスを使用する場合は[Qt Core]、 #*: 画面の作成が伴う場合は[Qt Gui]、ウィジェットの作成が伴う場合は[Widget]を選択する。 #*: [クラス名:]、[ソースファイル名:]、[ヘッダ名:]は任意のものに設定する。 #* [Translation File]や[キットの選択]は任意のものに設定する。 <br> 以下の例では、動的ライブラリとしてQMLの<code>Window</code>コンポーネントを作成している。<br> <syntaxhighlight lang="c++"> // LibSample_global.hファイル #ifndef LIBSAMPLE_GLOBAL_H #define LIBSAMPLE_GLOBAL_H #if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) #define Q_DECL_EXPORT __declspec(dllexport) #define Q_DECL_IMPORT __declspec(dllimport) #else #define Q_DECL_EXPORT __attribute__((visibility("default"))) #define Q_DECL_IMPORT __attribute__((visibility("default"))) #endif #if defined(LIBSAMPLE_LIBRARY) #define LIBSAMPLE_EXPORT Q_DECL_EXPORT #else #define LIBSAMPLE_EXPORT Q_DECL_IMPORT #endif #endif // LIBSAMPLE_GLOBAL_H </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // LibSample.h #ifndef LIBSAMPLE_H #define LIBSAMPLE_H #include <QObject> #include <QString> #include <QQmlComponent> #include <QtQml/qqmlengine.h> #include "hoge_global.h" class LIBSAMPLE_EXPORT LibSample : public QObject { Q_OBJECT public: explicit LibSample(QQmlEngine *engine, QObject *parent = nullptr); Q_INVOKABLE void showQmlWindow(); private: QQmlEngine *m_engine; }; #endif // LIBSAMPLE_H </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // LibSample.cpp #include <QQmlComponent> #include <QtQuick/QQuickWindow> #include "LibSample.h" LibSample::LibSample(QQmlEngine *engine, QObject *parent) : QObject(parent), m_engine(engine) { qDebug() << "LibSample lib"; } void LibSample::showQmlWindow() { QQmlComponent component(m_engine, "qrc:/Hoge/Hoge.qml"); QObject *object = component.create(); if (object) { QQuickWindow *window = qobject_cast<QQuickWindow*>(object); if (window) { window->show(); } } } </syntaxhighlight> <br> 動的ライブラリのプロジェクトをビルドして、debugディレクトリまたはreleaseディレクトリにライブラリが生成される。<br> <br> <u>※注意</u><br> <u>Windowsの場合、.dllファイルと.aファイルが生成されるため、.aファイルの<code>.a</code>拡張子を<code>.lib</code>拡張子に変更する必要がある。</u><br> <br> ==== 動的ライブラリのリンク ==== 動的ライブラリをQtプロジェクトにリンクするには、以下の手順を行う。<br> <br> # Qt Creatorのメイン画面左の[プロジェクト]ペインから、プロジェクト名を右クリックして、[ライブラリを追加]を選択する。 # [ライブラリの追加]画面が開くので、以下の項目を設定する。<br> #* [ライブラリの種類]画面は、[外部ライブラリ]を選択する。 #* [外部ライブラリ]画面は、ライブラリのリンク方法とライブラリのパスを選択する。 #*: [ライブラリファイル:]項目は、動的ライブラリファイルのパスを入力する。(<u>動的ライブラリの<code>.so</code>ファイルまたは<code>.a</code>ファイルを指定</u>) #*: [インクルードパス:]項目は、動的ライブラリのヘッダファイルが存在するパスを入力する。 #*: [リンク方法]は、[ダイナミック]を選択する。 # これにより、動的ライブラリとして、Qtプロジェクトにリンクすることができる。<br><u>Qtプロジェクトのビルドは不要である。</u> <br> 次に、動的ライブラリの機能を使用するため、動的ライブラリのヘッダファイルをインクルードする。<br> # Qt Creatorのメイン画面左の[プロジェクト]ペインから、プロジェクト名を右クリックして、[既存のファイルの追加...]を選択する。 # ファイル選択ダイアログから、動的ライブラリのヘッダファイルを選択する。<br>ヘッダファイルをインクルードすることにより、動的ライブラリの機能が使用できるようになる。 # <u>ただし、動的ライブラリはQT Creatorから独立して実行されるため、実行ファイルと同じディレクトリに動的ライブラリを配置する必要がある。</u> <syntaxhighlight lang="cmake"> # ...略 qt_add_executable(exeSample src/main.cpp ../LibSample/LibSample.h ) # ...略 # ライブラリへのパスを指定 target_link_libraries(exeSample PRIVATE ${CMAKE_SOURCE_DIR}/../LibSample/${CMAKE_BUILD_TYPE}/libsample.so ) target_include_directories(exeSample PRIVATE ${CMAKE_SOURCE_DIR}/../LibSample ) </syntaxhighlight> <br> <syntaxhighlight lang="c++"> #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include "LibSample.h" #include "app_environment.h" #include "import_qml_components_plugins.h" #include "import_qml_plugins.h" int main(int argc, char *argv[]) { set_qt_environment(); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); LibSample libSample(&engine); engine.rootContext()->setContextProperty("libSample", &libSample); engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml"); engine.addImportPath(":/"); engine.load(url); if (engine.rootObjects().isEmpty()) { return -1; } return app.exec(); } </syntaxhighlight> <br> ==== 動的ライブラリの明示的リンク ==== Qtには、動的ライブラリの関数を簡単に使用するために、<code>QLibrary</code>クラスが用意されている。<br> <br> 明示的リンクを使用して、動的ライブラリの関数を呼び出す手順は、以下の通りである。<br> # 動的ライブラリの関数において、C言語のグローバル関数として定義する。 # 動的ライブラリを生成する。 # 動的ライブラリを呼び出す側の実行ファイルと同じディレクトリに、動的ライブラリを配置する。 # QLibraryクラスを使用して、動的ライブラリの関数を呼び出す。 <br> 以下の構成を持つ2つのプロジェクトを作成したとする。<br> * プロジェクト構成 ** 動的ライブラリ **: Utils ** 実行ファイル **: Moc <br> まず、Utilsプロジェクトにおいて、関数のみを定義したUtils.cppファイルを作成する。<br> <syntaxhighlight lang="c++"> // Utils_global.h #ifndef UTILS_GLOBAL_H #define UTILS_GLOBAL_H #include <QtCore/qglobal.h> #if defined(Q_OS_WIN) // Windows #if defined(UTILS_LIBRARY) #define UTILS_EXPORT __declspec(dllexport) #else #define UTILS_EXPORT #endif #elif defined(Q_OS_LINUX) // Linux #if defined(UTILS_LIBRARY) #define UTILS_EXPORT Q_DECL_EXPORT #else #define UTILS_EXPORT Q_DECL_IMPORT #endif #endif #endif // UTILS_GLOBAL_H </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // Utils.cpp #include "Utils_global.h" #include <iostream> extern "C" UTILS_EXPORT void SampleHello(int count) { while(--count) { fprintf(stdout, "Hello!!"); } } </syntaxhighlight> <br> 次に、Mocプロジェクト(動的ライブラリを使用する側)から、動的ライブラリの関数を呼び出す。<br> <br> <code>QLibrary</code>クラスから呼び出す関数は、必ず、C言語のグローバル関数として定義すること。<br> これは、マングリングしていない元の名前から関数を呼び出すためである。<br> <br> <u>※注意</u><br> <u>Windowsでは、動的ライブラリから関数を呼び出すには、<code>__declspec(dllexport)</code>を関数の前に付加すること。</u><br> <br> <code>QLibrary</code>クラスのコンストラクタには、<code>.so</code>拡張子または<code>.dll</code>拡張子を付加しないライブラリ名を渡す。<br> 動的ライブラリをリンクするには、<code>load</code>メソッドを実行する。<br> 次に、<code>resolve</code>メソッドを使用して呼び出す関数名を渡して、関数が存在する場合は関数ポインタが返る。<br> 関数名や型が間違っている場合は、0が返る。<br> <br> もし、関数内でグローバル変数の値が変更された場合、次の関数を呼び出した時でも、グローバル変数の値を保持し続ける。<br> <syntaxhighlight lang="c++"> // main.cpp #include <QApplication> #include <QLibrary> using SampleFunc = void (*)(int); int main(int argc, char * argv[]) { QApplication a(argc, argv); // 動的ライブラリをリンクする QLibrary lib("Utils"); lib.load(); // 動的ライブラリの関数を取得する SampleFunc Func = (SampleFunc)lib.resolve("SampleHello"); if(Func != 0) { Func(10); } return a.exec(); } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
QMLの基礎 - ライブラリ
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse