背景
- すでに CMake/Meson あたりで CLI C++11 アプリを作っていて, Qt5 を追加したい.
- そんな凝った GUI を作る必要はない(主にデバッグ用に GUI を追加したい)
- imgui とかで UI もいいが, Qt5 も使いたいときがある(フォントのアンチエイリアスや, UI レスポンスの良さ, Webview 使いたいなど).
- Qt Studio とか, MOC コンパイラとか, qmake とか使いたくない
- UI デザイナとか使いたくないし, 使う理由もあまなりない. imgui, Jetpack Compose, Swift UI のように declative に UI を C++ でゴリゴリ記述したい.
Signal/Slot
Qt5 から, C++11 lambda で signal/slot が記述しやすくなっています.
QObject::connect
で直接記述することにより, Q_OBJECT な class を作る必要もなくなりそうな気がします(-> MOC コンパイルが不要になる)
UI の記述
.cpp にベタがきします. ImGui を使っている方にはこのほうがやりやすいかと思います.
.ui を実行時に読み込んで GUI を作ることもできます.
Qt
オフィシャルのドキュメントが参考になります.
実務的なアプリの設定としては, Appleseed renderer の Appleseed Studio の設定が参考になります.
Meson
Qt5 用の設定がありますので, これを使います.
今回は moc の設定などは不要ですが, 必要だったとしてもそれほど手間をかけずに moc 対応できますね.
Prebuilt package
最近の Qt SDK は変なインストーラータイプになり, またパッケージ自体も 1~2 GB と無駄に大きいです.
Linux(Ubuntu)であれば apt で SDK は一応入りますが, Windows では Qt5 SDK 単体が欲しいですね.
Qt5 の必須ライブラリのプレビルドを配布しているのがありますので, こちらを利用しましょう.
DLL のコピー
特に(?) Windows の場合, plugin dll などが .exe の場所 or 環境変数で設定されている場所にインストールする必要があります.
windeployqt というツールで, ファイルを一式セットアップしてくれるコマンドがありますが,
これはコピー元のフォルダはビルド時に固定で引数設定できないため, たとえば
で配布されている qt prebuilt を使おうとしても, 配布物に含まれている windeployqt.exe は動きません.
CMakeList.txt に必要なファイルコピー操作を直接記述するのがよさそうかもです.
以下のような感じで postbuild コマンドで, .dll などコピーできます.
if (MSVC)
file(GLOB QT5_DLLS "${QT5_INSTALL_PREFIX}/lib/*.dll")
add_custom_command(TARGET example-app
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${QT5_DLLS}
$<TARGET_FILE_DIR:example-app>)
endif (MSVC)
まとめ
CMake で既存ビルドツールに Qt5 で GUI を追加することができました.
MOC, UI など使わない形でも UI を追加できました.
References
- Build with CMake https://doc.qt.io/qt-5/cmake-manual.html
TODO
- QML を試す.
- リソースファイルや, app パッケージングを整備する