12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CMakeを使用してQt5アプリケーションを作成する

Last updated at Posted at 2016-03-28

この記事はCMakeの基本的な使い方をある程度把握しており、
CMakeを使用してQtアプリケーション作成したい人を対象としています。
今回はQt5.6、CMake3.5を使用しました。

プロジェクト名とアプリのバージョンを設定する

cmake_minimum_required(VERSION 3.0)
project(MinimalQtApp VERSION 0.0.1)

cmake_minimum_required()CMakeのバージョンを指定します。
project()で作成するアプリ名とバージョンを指定します。
CMake3.0からVERSION *.*.*と書くことでバージョンナンバーを指定できるようになりました。

QTDIRを指定する

set(QTDIR $ENV{QTDIR})
set(CMAKE_PREFIX_PATH ${QTDIR})

後に登場しますがfind_package(Qt5...)という構文で自動でQtライブラリをサーチすることができます。
このfind_package(Qt5...)という構文でライブラリをサーチするためには、QTDIRにQtライブラリのルートディレクトリを設定する必要がありますのでここでセットしておきます。
QTDIRはシステムの環境変数に登録しておくかプロジェクトの環境変数として登録しておくのが良いでしょう。

Qtライブラリをプロジェクトに追加する

find_package(Qt5Widgets REQUIRED)
︙
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

Qtライブラリをプロジェクトに追加するにはfind_package()でQtライブラリを探してきてtarget_link_libraries()を使用してアプリケーションにリンクします。
上記の例ではWidgetsしか指定していませんが、Widgetsの依存しているCoreGuiも自動でリンク対象になります。

uiファイルを処理する

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
︙
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})

qt5_wrap_ui(UI_HEADERS ${UI_SOURCES})

GUIアプリケーションを作成する際には多くの場合.uiを用いてレイアウトを作成することになると思います。
CMakeにはqt5_wrap_ui()という.uiファイルをコンパイル可能なヘッダに変換してくれる便利な関数がありますのでこれを利用します。
この関数を利用するにはCMAKE_INCLUDE_CURRENT_DIRCMAKE_AUTOMOCONに設定します。
ヘッダファイルはビルドディレクトリに出力されますので${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR}をインクルードディレクトリに追加してあげることで、生成されたヘッダファイルをプロジェクトが見つけることができるようになります。

アイコンを同梱する

if(WIN32)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.rc)
elseif(APPLE)
set(MACOSX_BUNDLE_ICON icon.icns)
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.icns)
set_source_files_properties(${APP_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
endif()

if(WIN32)
set(APP_BUNDLE WIN32)
elseif(APPLE)
set(APP_BUNDLE MACOSX_BUNDLE)
endif()

add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_HEADERS})

if(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/AppleInfo.plist)
endif()

Windowsの場合はバンドルタイプをWIN32に指定し、用意した.ico``.rcファイルの.rcファイルの方をアプリケーションに追加することでアイコンを登録できます。
Macの場合はバンドルタイプを指定しアイコンをアプリケーションに追加するところまではWindowsと同じですが、それプラスAppleInfo.plistを作成してset_target_properties()でアプリケーションに登録する必要があります。
この設定ファイルはCMake同梱のものがありますのでそちらを参考に作成すると良いでしょう。

HiDPI対応する(Macのみ)

<key>NSHighResolutionCapable</key>
<true/>

Macの場合はHiDPI対応も視野に入れる必要があります。
HiDPIに対応するためには前述のAppleInfo.plistNSHighResolutionCapable trueを追加してあげるとことでHiDPIモードでアプリが起動するようになります。
Qt5.5までのバージョンではそれプラスQApplicationに明示的にQt::AA_UseHighDpiPixmapsを指定する必要がありました。

パッケージをデプロイする

【Windows】
windeployqt.exe MinimalQtApp.exe

【Mac】
macdeployqt MinimalQtApp.app

Qt同梱のwindeployqtmacdeployqtなどのコマンドを使用すると依存ライブラリを実行ファイルのあるディレクトリまでコピーしてくれます。
但しwindeployqtはQtライブラリ以外の依存関係は解決してくれませんので、Qt以外のライブラリは自分でコピーすることになります。
macdeployqtも依存関係が解決できない場合がありますのでその場合はinstall_name_toolを使用して自分で依存関係を解決する必要があります。

今回はハマりそうな部分だけを書きましたが、
こちらにサンプルプロジェクトが置いてありますのでご参考にどうぞ!

それでは素敵なQtライフを!

追記

uiファイルの処理について (2016年3月31日)

CMake3.0からCMAKE_AUTOUICONにして.uiファイルをadd_executable()に渡すとqt5_wrap_ui()を使用せずとも自動でヘッダファイルを作成してくれるようです。

cmake_minimum_required(VERSION 3.0)
︙
set(CMAKE_AUTOUIC ON)
︙
add_executable(${PROJECT_NAME} ${APP_BUNDLE} ${APP_ICON} ${SOURCES} ${HEADERS} ${UI_SOURCES})

shibukawaさん情報ありがとうございました!

12
17
2

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
12
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?