3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

本記事は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)からダウンロード可能です。
以下のライセンスから選択できます:

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

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

インストール手順の例:

  1. Qt公式サイトへアクセス
  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. シグナル/スロット接続の方法

モダンな接続構文(推奨)

connect(button, &QPushButton::clicked,
        this, &MainWindow::onButtonClicked);

ラムダ式やメンバー関数ポインタを利用できるため、可読性が高く推奨されています。

従来の文字列ベース構文

connect(button, SIGNAL(clicked()),
        this, SLOT(onButtonClicked()));
  • QAxObjectQAxWidgetの使用時
  • QDBusInterfaceでのD-Bus接続
  • QWizardPage::registerField() の使用時
    など、特定のケースで必要となる場合があります。

4-2. 実践例:ボタンでラベルを変更

connect(ui->pushButton, &QPushButton::clicked, this, [=](){
    ui->label->setText("Button Clicked!");
});

ラムダ式を使うことで、短くわかりやすいコードが書けます。これでボタンをクリックするたびにラベルが更新されます。


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

5-1. レイアウトを使う理由

ウィンドウサイズが変わっても自動的に配置を調整してくれるため、ハードコードされた座標管理より保守性柔軟性が高いです。

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

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

5-3. コード例:QVBoxLayout

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 6.8を存分に活用してみてください!

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?