Qt 入門:プロジェクト構成とシグナルスロット機制

プロジェクトの初期設定

Qt Creator を利用して新規プロジェクトを構築する際、プロジェクトパスには半角英数字のみを使用し、日本語や特殊文字が含まれないように注意する必要があります。これはビルドシステムにおける互換性問題を避けるためです。

プロジェクトファイル(.pro)の構造

Qt プロジェクトの核となる .pro ファイルは、qmake によって解釈され、Makefile の生成に使用されます。主要な設定項目は以下の通りです。

#-------------------------------------------------
# Qt プロジェクト設定ファイル
#-------------------------------------------------

# 使用する Qt モジュールの宣言
QT       += core gui

# Qt _version_5 以上では widgets モジュールが別途必要
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# 生成される実行ファイルの名前
TARGET = qt_intro_app

# プロジェクトのテンプレート種類(アプリケーション)
TEMPLATE = app

# 非推奨 API 使用時の警告有効化
DEFINES += QT_DEPRECATED_WARNINGS

# ソースファイルのリスト
SOURCES += \
        main.cpp \
        mainwindow.cpp

# ヘッダーファイルのリスト
HEADERS += \
        mainwindow.h

# UI デザイナーファイル
FORMS += \
        mainwindow.ui

# リソースファイル(画像など)
RESOURCES += \
    assets.qrc

UI デザイナーによる画面構築

Qt Designer を使用してグラフィカルインターフェースを作成します。ここではユーザー登録画面を例に構成手順を示します。

  • ウィンドウサイズの調整
    • プロパティエディタの geometry セクションを展開し、サイズを 640 x 480 に設定します。
  • ラベルの配置
    • Display Widgets カテゴリから Label (QLabel) をドラッグします。これはテキストや画像の表示に使用されます。
    • ダブルクリックでテキスト内容を編集し、フォントやalignment(配置)はプロパティエディタで調整可能です。
  • 入力フィールドの追加
    • ユーザー名やパスワード入力には Input WidgetsLine Edit (QLineEdit) を使用します。
    • パスワード欄については、プロパティの echoModePassword に変更し、入力内容を隠蔽します。
  • ボタンの配置
    • 操作トリガーには Buttons カテゴリの Push Button (QPushButton) を配置します。

オブジェクト名の命名規則

コードから UI 部品を制御しやすくするため、オブジェクトインスペクター内で各ウィジェットに意味のある名前を付与します。例えば、送信ボタンであれば submitBtn のように、役割が推測できる名称にすることが推奨されます。

シグナルとスロットの仕組み

Qt の根幹をなす通信機制です。

  • シグナル (Signal): ウィジェットの状態変化やイベント発生を通知するメッセージです。例えば、ボタンが押された事実などが該当します。
    • 継承元クラスを含めると、QPushButtonclicked, pressed, released, toggled などのシグナルを発行可能です。
  • スロット (Slot): シグナルを受信して処理を行うメンバー関数です。特定のシグナルに绑定(バインド)されることで実行されます。

シグナルとスロットの接続方法

接続には主に 2 つのアプローチがあります。

1. 命名規則による自動接続

デザイン画面で控件を右撃し、「槽へ移動」を選択することで実装できます。この場合、槽関数は以下の命名規則に従う必要があります。

void on_<オブジェクト名>_<シグナル名>(<パラメータ>);

この規則に従った場合、Qt のメタオブジェクトシステムが自動的に接続処理を行います。

ヘッダーファイル (mainwindow.h)

private slots:
    void onConfirmBtnClicked();

ソースファイル (mainwindow.cpp)

void MainWindow::onConfirmBtnClicked()
{
    qDebug() << "Confirmation processed";
}

2. connect 関数による明示的接続

自動接続の命名規則を使わない場合や、実行時に接続を制御したい場合は connect 関数を使用します。なお、自動接続規則と重複すると槽関数が二度実行されるため注意が必要です。

現代の Qt (C++11 以降) では、関数ポインタを用いた型安全な構文が推奨されます。

ソースファイル (mainwindow.cpp)

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // submitBtn が clicked を発行したら、handleSubmission を実行
    connect(ui->submitBtn, &QPushButton::clicked, 
            this, &MainWindow::handleSubmission);
}

ヘッダーファイル (mainwindow.h)

private slots:
    void handleSubmission();

ソースファイル (mainwindow.cpp)

void MainWindow::handleSubmission()
{
    qDebug() << "Welcome user!";
}

タグ: qt-framework signal-slot-mechanism qt-creator cpp-gui qmake

6月10日 17:48 投稿