Qtチュートリアル：C++でクロスプラットフォームなGUIアプリを作ろう

## はじめに

本記事は**2024年1月時点の最新版Qt 6.8**を基準に解説しています。  
近年、デスクトップアプリから組み込み機器、モバイルまで、多様なプラットフォームで動くアプリケーションが求められています。
そこで注目されるのが、クロスプラットフォームGUI開発の代表的フレームワーク「**Qt（キュート）**」です。

QtはC++で開発された豊富な機能群を持つフレームワークで、Windows、macOS、Linux、そしてモバイルや組み込みデバイスにまで広く対応します。
GUI以外にもネットワーク、マルチメディア、データベース、Webエンジンなど、多角的な機能を揃えており、大規模開発を支えるエコシステムが整っています。

本記事では、初めてQtを触る方を対象に、**環境構築からHello World、レイアウト管理、Qtの主要モジュール、Qt 6の最新機能**までを解説し、実践的な開発に役立つ情報を提供します。

---

## 1. 開発環境の準備

### 1-1. Qtのダウンロードとインストール

Qtは公式サイト（[https://www.qt.io](https://www.qt.io)）からダウンロード可能です。
以下のライセンスから選択できます：

- **オープンソース版**：GPL 2.0、GPL 3.0、LGPL 3.0  
- **商用ライセンス版**：商用利用向け  

個人の学習やオープンソースプロジェクトではオープンソース版で十分ですが、商用アプリケーションを開発する場合はライセンスの要件を慎重に確認する必要があります。

インストール手順の例：
1. [Qt公式サイト](https://www.qt.io)へアクセス  
2. 「Download Free Trial」などのリンクから**Qt Online Installer**を取得  
3. インストーラを起動し、表示されるウィザードに沿って　**必要なコンポーネント（Qtのバージョン、コンパイラなど）** を選択  
   - WindowsならMinGWを選ぶとセットアップが容易  

### 1-2. Qt Creatorのインストール

Qtと同時にインストールされる公式IDEが**Qt Creator**です。  
- C++プロジェクト管理  
- GUIデザイナ（Qt Designer）  
- デバッグ連携  
- QMLサポート  

特に初学者には、Qt Creatorから始めることをおすすめします。

---

## 2. Qtプロジェクトの作成

Qt Creatorを起動したら、下記手順で簡単なプロジェクトを作ってみましょう。

1. **「New Project」** をクリック  
2. **「Qt Widgets Application」** または **「Qt Quick Application」** などのテンプレートから選択  
   - 従来型のGUIをC++メインで構築するなら「Qt Widgets Application」  
   - モダンなUIをQMLで組みたいなら「Qt Quick Application」  
3. プロジェクト名と保存先を指定  
4. インストール時に設定された**Kit（コンパイラ＆Qtバージョン）** を選択  
5. 最後に完了を押すと、雛形となるコードとUIファイルが生成されます  

以下のチュートリアルでは **「Qt Widgets Application」** をベースに解説します。

---

## 3. Hello Worldアプリケーション

### 3-1. プロジェクトの構成
Qt Widgets Applicationのテンプレートで生成される主なファイルは以下です。

- **main.cpp**  
  エントリポイント。`QApplication`のインスタンス生成、メインウィンドウの呼び出しなど。
- **mainwindow.h / mainwindow.cpp**  
  メインウィンドウのクラス定義と実装。ボタンやラベルの配置を行う。
- **mainwindow.ui**  
  Qt Designer（統合GUIデザイナ）で編集できるUIレイアウトファイル。

### 3-2. ラベルで「Hello World」を表示
1. `mainwindow.ui`をダブルクリックし、デザイナを開く  
2. ウィンドウ上に「Label」をドラッグ＆ドロップ  
3. 右側のプロパティで`text`を「Hello World」に変更  
4. ビルドして実行すると、ウィンドウに「Hello World」が表示されます  

---

## 4. シグナルとスロット：イベント処理の基本

Qtの特徴的な仕組みが**シグナル（signal）**と**スロット（slot）** です。  
- **Signal**: ボタンが押されるなどのイベント通知  
- **Slot**: シグナルを受け取って実行される関数

### 4-1. シグナル/スロット接続の方法

#### モダンな接続構文（推奨）
```cpp
connect(button, &QPushButton::clicked,
        this, &MainWindow::onButtonClicked);
```
ラムダ式やメンバー関数ポインタを利用できるため、可読性が高く推奨されています。

#### 従来の文字列ベース構文
```cpp
connect(button, SIGNAL(clicked()),
        this, SLOT(onButtonClicked()));
```
- **QAxObject**や**QAxWidget**の使用時  
- **QDBusInterface**でのD-Bus接続  
- **QWizardPage::registerField()** の使用時  
など、特定のケースで必要となる場合があります。

### 4-2. 実践例：ボタンでラベルを変更
```cpp
connect(ui->pushButton, &QPushButton::clicked, this, [=](){
    ui->label->setText("Button Clicked!");
});
```
ラムダ式を使うことで、短くわかりやすいコードが書けます。これでボタンをクリックするたびにラベルが更新されます。

---

## 5. ウィジェットとレイアウト管理

### 5-1. レイアウトを使う理由
ウィンドウサイズが変わっても自動的に配置を調整してくれるため、ハードコードされた座標管理より**保守性**や**柔軟性**が高いです。

### 5-2. 主なレイアウトクラス

- **QVBoxLayout / QHBoxLayout**  
  縦（V）・横（H）方向にウィジェットを連続配置  
- **QFormLayout**  
  ラベルと入力フィールドの2列構成（フォーム）に最適  
  ```cpp
  QFormLayout *layout = new QFormLayout;
  layout->addRow("名前:", new QLineEdit);
  layout->addRow("年齢:", new QSpinBox);
  ```
- **QGridLayout**  
  格子（グリッド）形式でウィジェットを配置。複雑な画面レイアウトに対応

### 5-3. コード例：QVBoxLayout
```cpp
QVBoxLayout *layout = new QVBoxLayout;
QLabel *label1 = new QLabel("上のラベル");
QLabel *label2 = new QLabel("下のラベル");

layout->addWidget(label1);
layout->addWidget(label2);

QWidget *centralWidget = new QWidget;
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
```

---

## 6. Qt QuickとQt Widgetsの比較

### 6-1. Qt Quick (QML)
- GPUアクセラレーションを活用した描画が可能で、アニメーションや複雑なUIに適しています。  
- モダンなUIを宣言的に記述（QML）  
- モバイル、組み込み、デスクトップまで幅広く活用できる

### 6-2. Qt Widgets
- デスクトップアプリ向けに豊富な標準ウィジェットを提供  
- C++で記述する直感的なプログラミングモデル  
- 従来型のアプリケーションに向いており、既存コードベースとの互換性が高い

### プラットフォーム特性の違い

#### Qt Widgets
- OSネイティブのルック＆フィールを自動的に採用  
- プラットフォーム標準のUIコントロールと一貫性ある外観  
- アクセシビリティ機能との統合が比較的容易

#### Qt Quick
- プラットフォーム非依存の一貫したUI表現  
- カスタムデザインの実装がしやすい  
- モバイルやタッチデバイスに最適化された操作性

---

## 7. Qt Essentialsモジュール

Qtには多彩なモジュールが存在しますが、まずは以下の**Essentials**を押さえると全体像を把握しやすくなります。

- **Qt Core**  
  - 非GUIクラス群、文字列・コンテナ・イベントループ・スレッドなど基本機能  
- **Qt GUI**  
  - ウィンドウシステム統合、2D/3D描画、OpenGL連携  
- **Qt Widgets**  
  - デスクトップ向けのUIコンポーネント群  
- **Qt Quick**  
  - QMLによる宣言的UIフレームワーク  
- **Qt Network**  
  - HTTP、TCP/UDP、SSL/TLSなどネットワーク関連機能  
- **Qt Multimedia (Qt 6.2以降)**  
  - プラットフォーム間で一貫した新しいマルチメディアバックエンド  
  - 改善されたカメラ、オーディオ、ビデオキャプチャAPI  
  - 柔軟なメディアプレーヤー機能とストリーミングサポート  
  - プラットフォームネイティブ機能へのアクセス  

---

## 8. 開発環境の活用

### 8-1. Qt Creatorの詳細設定

- **プラグイン管理**  
  「Help > About Plugins」からプラグインを有効・無効化できる。Git連携、LSP、Dockerプラグインなど。
- **QML開発支援**  
  - **QML Designer**でドラッグ＆ドロップによるUI設計  
  - **Live Preview**によるリアルタイムプレビュー  
  - JavaScriptコンソールやデバッガを使った高度な検証

---

## 9. ビルドシステム

### 9-1. CMakeの採用
Qt 6ではCMakeが標準ビルドシステムとして推奨されます。  
- モダンC++プロジェクト管理との統合が容易  
- サードパーティライブラリの依存関係管理が改善  
- クロスコンパイル環境の構築が簡素化  
- より柔軟なビルド設定とカスタマイズが可能  

qmakeも引き続きアプリケーション開発でサポートされており、**既存のqmakeプロジェクトは継続して利用できます**。
ただし、**新規プロジェクトではCMakeの採用**が推奨されます。

---

## 10. Qt 6の主要な改善点

Qt 6では、内部アーキテクチャが大幅に刷新され、最新プラットフォームやハードウェアを活用する多くの改善が行われました。

- **QMLエンジンの刷新**  
  - 新しいQMLコンパイラによる高速化  
  - タイプセーフな型システム  
  - より良いエラー検出  
- **グラフィックス機能**  
  - RHI（Rendering Hardware Interface）の導入  
  - マルチスレッドレンダリングのサポート  
  - 改善されたGPUアクセラレーション  
- **CMakeビルドシステム**  
  - qmakeからCMakeへの移行が容易  
  - モダンなビルドシステムとの統合  
- **ディスプレイとスケーリング**  
  - 改善されたHiDPIサポート  
  - フラクショナルスケーリングをネイティブにサポート  
  - 正確なピクセル密度処理  
- **State Machineフレームワークの改善**  
  - QMLとの統合強化  
  - より直感的なステート管理  
  - パフォーマンスの最適化  
- **HTTP/WebSocketsの強化**  
  - HTTP/2サポートの改善  
  - 非同期APIの拡充  
  - セキュリティ機能の強化  

---

## 11. デプロイと配布

### 11-1. Windows向け
- **windeployqt**ツールを利用して必要なDLLやプラグインを自動収集  
- コンパイラの違い（MSVC／MinGW）やDLLの依存関係に注意

### 11-2. macOS向け
- アプリバンドルを作成後、**macdeployqt**でQtフレームワークをバンドル  
- Gatekeeper対応やアプリ署名にも留意

### 11-3. Linux向け
- AppImageやFlatpakなどを使い、Qt依存ライブラリを同梱  
- ディストリビューションごとのパッケージ（.deb、.rpmなど）も選択肢

### 11-4. ライセンスコンプライアンス
- オープンソース版を使用する場合、GPL/LGPLの要件に従う必要がある  
- 商用アプリケーションの場合、商用ライセンスの取得を検討  
- 使用するQtモジュールとライセンスの互換性を確認  

---

## 12. 初学者向けトラブルシューティング

Qt開発を始めたばかりの方が遭遇しがちなトラブルと対処法をいくつか挙げます。

- **ビルドエラー「fatal error: QtWidgets: No such file or directory」**  
  - Qtのパスが通っていない、またはKit設定が誤っている可能性。  
  - 「Projects」タブで選択したQtバージョンを再確認。

- **UIファイル（.ui）を編集しても画面に反映されない**  
  - 自動生成されたヘッダが更新されていないことが原因。  
  - 一度クリーンビルドして再ビルド、または`qmake`/`CMake`を再走査。

- **DLLが見つからないエラー（Windows）**  
  - 実行ファイルと同じフォルダに必要なDLLをコピーしていない。  
  - `windeployqt`などでDLLを収集。

- **QMLがコンパイルエラーを出す／動作しない**  
  - QMLインポートパスが通っていない場合あり。  
  - `import`文のバージョンを確認、または`QML_IMPORT_PATH`を設定。

---

## 13. まとめ

本記事では、Qtの環境構築から簡単なGUIアプリの作成、シグナルとスロットの概念、レイアウト管理、**Qt Quick vs Qt Widgetsの比較**、**Qt Essentialsモジュール**、**CMake移行**などの最新動向まで幅広く紹介しました。

- **即時性が必要なデスクトップアプリ** → Qt Widgetsが向いている  
- **アニメーション重視のモバイル・組み込みUI** → Qt Quick（QML）が便利  
- **Qt 6**での最新アーキテクチャ → CMakeベース、RHI、QMLエンジンの高速化 など  

Qtは奥が深く、初めは取っつきにくい部分もあるかもしれません。
しかしながら、一度使いこなせるようになると、**クロスプラットフォーム開発の効率**や**モダンUIの構築**など、多くのメリットを享受できます。
公式ドキュメントやサンプルを参考にしながら、ぜひQtの世界を楽しんでください。

---

### 参考リンク
- [Qt公式サイト](https://www.qt.io)  
- [Qt公式ドキュメント](https://doc.qt.io)  
- [Qt for Beginners - Qt公式チュートリアル](https://doc.qt.io/qt-6/gettingstartedqtandc.html)  
- [Qt GitHubリポジトリ](https://github.com/qt)  
- [Qt Licensing](https://www.qt.io/licensing/)  
- [Qt 6.8 Documentation](https://doc.qt.io/qt-6.8/)  

以上で修正指示を反映したチュートリアル記事となります。
ぜひ実際に手を動かしながら、最新のQt 6.8を存分に活用してみてください！

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/