背景
- すでに 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 というツールで, ファイルを一式セットアップしてくれるコマンドがありますが,
これはコピー元のフォルダはビルド時に固定で引数設定できないため, たとえば
https://github.com/martinrotter/qt5-minimalistic-builds
で配布されている 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 パッケージングを整備する