Pynote

Python、機械学習、画像処理について

Qt - ビルドシステムに CMake を利用する (翻訳機能を使うプロジェクト)

概要

Qt の翻訳機能を使うプロジェクトを CMake でビルドする方法について紹介する。
基本編は過去の記事を参照してほしい。
pynote.hatenablog.com

試した環境

  • Ubuntu 16.04
  • Qt 5.9.1
  • CMake 3.5.1

手順

サンプルコード全体はこちら

qt_examples/cmake_example/translation at master · nobetan/qt_examples · GitHub

f:id:nekobean:20171028184933p:plain

ラベルに表示されている「Hello World」を「こんにちは」に翻訳していきます。

ファイルを用意する。

フォルダ構成

translation/
├── CMakeLists.txt
├── lang
└── src
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui

main.cpp

#include <QTranslator>

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTranslator translator;
    translator.load("japanese");
    app.installTranslator(&translator);

    MainWindow w;
    w.show();

    return app.exec();
}

CMakeLists.txt

# CMake の最低限必要なバージョンは設定する。
# Qt では 2.8.3 以上が必須、3.1.0 以上が推奨である。
cmake_minimum_required(VERSION 2.8.3)

# プロジェクト名を設定する。
project(sample)

# ビルドディレクトリを include ディレクトリに追加するオプションを有効にする。
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# MOC が必要な場合は自動的に実行するオプションを有効にする。
set(CMAKE_AUTOMOC ON)

# UI 定義ファイルの変換が必要な場合は自動的に実行するオプションを有効にする。
set(CMAKE_AUTOUIC ON)

# QtWidgets ライブラリを追加する。
find_package(Qt5Widgets REQUIRED)
find_package(Qt5LinguistTools REQUIRED)

# src ディレクトリにあるビルド対象のファイルをリストアップする。
file(GLOB_RECURSE CPP_FILES src/*.cpp)
file(GLOB_RECURSE UI_FILES src/*.ui)

# 生成する翻訳スクリプトファイルを設定する。
SET(TS_FILES
    lang/japanese.ts
)

# 翻訳対象のファイルを設定する。
SET(TRANSLATION_TARGET_FILES
    ${CPP_FILES}
    ${UI_FILES}
)

# 翻訳ファイルを生成する設定を行う。
qt5_create_translation(QM_FILES
    ${TRANSLATION_TARGET_FILES} # 翻訳対象のファイル
    ${TS_FILES}                 # 翻訳スクリプトファイル
)

# src ディレクトリを include ディレクトリに追加する。
include_directories(src)

# 生成する実行ファイルを追加する
add_executable(${PROJECT_NAME}
    ${CPP_FILES}
    ${UI_FILES}
    ${QM_FILES}
)

# 依存ライブラリをリンクする
target_link_libraries(${PROJECT_NAME}
    Qt5::Widgets
)

Qt に関連する CMake の書き方

find_package(Qt5LinguistTools REQUIRED)

qt5_create_translation() を使うには、Qt5LinguistTools が必要である。

SET(TS_FILES
    lang/japanese.ts
)

生成する翻訳スクリプトを設定する。

SET(TRANSLATION_TARGET_FILES
    ${CPP_FILES}
    ${UI_FILES}
)

翻訳対象のファイルとして、*.cpp ファイル及び *.ui ファイルを設定する。

qt5_create_translation(QM_FILES
    ${TRANSLATION_TARGET_FILES}
    ${TS_FILES}
)

翻訳対象のファイル及び翻訳スクリプトから翻訳ファイル (*.qm) を生成する設定を行う。

翻訳スクリプトを生成する。

1. ビルドする。

$ mkdir build
$ cd build
$ cmake ..
$ make

すると、翻訳対象のファイルを基に lang/japanese.ts が生成される。

2. Qt Linguist で翻訳スクリプトを編集する。

2.1. 翻訳スクリプトを開く
メニューの「ファイル」->「開く」から lang/japanese.ts を開く。

f:id:nekobean:20171028184207p:plain

2.2. 翻訳元/翻訳先の言語及び地域を設定する。

f:id:nekobean:20171028184340p:plain

2.3. 翻訳する。

翻訳する文字列を選択し、訳を記述する。

f:id:nekobean:20171028184440p:plain

2.4. 保存する。

f:id:nekobean:20171028184446p:plain

再度、ビルドする。
$ make

ビルドディレクトリには翻訳スクリプトをもとに翻訳ファイル japanese.qm が生成される。
実際使用されるのは翻訳スクリプトでなく、このファイルであるため、add_executable() に追加しておいた。

add_executable(${PROJECT_NAME}
    ${CPP_FILES}
    ${UI_FILES}
    ${QM_FILES}
)
実行する
$ make

Hello World」が「こんにちは」と翻訳されて表示されました。

f:id:nekobean:20171028185316p:plain