LoginSignup
0
0

More than 3 years have passed since last update.

C++11 アプリに CMake or Meson 既存ビルドツールを使って Qt5 で GUI を追加するメモ

Last updated at Posted at 2019-10-13

背景

  • すでに 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

TODO

  • QML を試す.
  • リソースファイルや, app パッケージングを整備する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0