見出し画像

Qt5再入門: Qt DesignerでNotes C APIコンバートシミュレーターダイアログを作る(その3)

今回は、ダイアログをメインウィンドウのメニューから呼び出す方法と、ダイアログ上のボタンのカスタマイズについて、RADツールからの操作をメインに説明します。

メニューの追加

メインウィンドウを、Qt Designerで開きます。
メインウィンドウの上部のメニューバーには、メニューを追加できる箇所に「ここに入力」と表示されているので、ここでダブルクリックをします。

スクリーンショット 2021-09-06 20.16.05

すると、カーソルアイコンに変わり、テキストを入力することができるようになるので、半角で「&Tools」と入れます。

スクリーンショット 2021-09-06 20.17.37

「&」に続く英文字が「アクセスキー」として機能します。

入力を終えてEnterキーを押すと、メニュー文字列が有効になり、サブメニューに項目を追加できるようになります。有効になった「Tools」メニューは、右の「オブジェクトインスペクタ」ペインで、「QMenu」クラスの「menu_Tools」として登録されたことがわかります。
では、Toolsメニュー直下にある「ここに入力」の箇所をダブルクリックします。

スクリーンショット 2021-09-06 20.19.13

「&Convert Simulator」と入力し、Enterキーを押します。

スクリーンショット 2021-09-06 20.20.24

サブメニューが確定し、オブジェクトインスペクタとその下「プロパティエディタ」にはQActionクラスの「action_Convert_Simulator」として登録されました。また同時に、下の「アクションエディタ」ペインにも、Convert SimulatorのQActionが追加されました。

スクリーンショット 2021-09-06 20.21.03

これで、メニューの追加は完了です。Qt Designerを閉じて、修正内容を保存し、Qt Creatorに戻ります。
ここで、一度Qt Creatorでビルドを実行しておきます。保存しただけだと、Qt Creatorが追加したQActionをインテリセンスで認識してくれないからです。

ダイアログを呼び出す

次に、メインウィンドウクラスにコンバートシミュレーターを開くスロット関数を追加します。ヘッダーファイルを開き、以下のようにします。

// mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// ...

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
 Q_OBJECT

// ...

public slots:
 /**
  * @brief コンバートシミュレーターを開く
  */
 void convertSimulator();

// ...

private:
 Ui::MainWindow *ui_;
};
#endif // MAINWINDOW_H

これを、先ほど追加したQActionのtriggeredシグナルと接続します。

// mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "convertsimulatordialog.h" // <- 追加

// ...

MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
 , ui_(new Ui::MainWindow)
{
 ui_->setupUi(this);

// ...

 connect(
       ui_->action_Convert_Simulator, &QAction::triggered,
       this, &MainWindow::convertSimulator
       );
}

// ... 続く ...

そして、スロット関数の実装をします。

// ... 続き

void MainWindow::convertSimulator() {
 ConvertSimulatorDialog dialog(this);
 dialog.exec();
}

動作確認してみます。
メニューの「Tools」から「Convert Simulator」を選択します。

スクリーンショット 2021-09-07 7.30.11

メインウィンドウの中央にダイアログが表示されました。

スクリーンショット 2021-09-07 7.30.43

ConvertSimulatorDialogはQDialogを継承しています。QDialog::execメソッドを実行すると、モーダルダイアログとして機能します。つまり、execメソッドから処理が返ってこない限り、MainWindowに操作権は戻ってこないことを意味します。MainWindowと操作権を共有できるモードレスダイアログを使うには、showメソッドを使用します。

QDialogの戻り値とボタンの関係

また、QDialog::execメソッドはint型の戻り値を持ちます。今回のダイアログは、シミュレートを追えたらただ閉じるだけなので、戻り値を気にする必要はありませんが、さきほどのダイアログのように「OK/キャンセル」や、「Yes/No」でダイアログを閉じる場合は、「どちらを押して閉じたのか」が重要になります。OKを押したら何かを実行し、キャンセルの場合はただ閉じるのみ、とするのはよくあることです。
QDialog::execメソッドが返す値は、その「どちらを押して閉じたのか」を示しています。値の定義としては、列挙型QDialog:DialogCodeで、QDialog::Accepted(1)か、QDialog::Rejected(0)のいずれかになります。

Qt Creatorのウィザードで、ボタン付きダイアログを作成した場合には、QDialogButtonBoxが自動的に付いてきます。このQDialogButtonBoxは、デフォルトでOKボタンとキャンセルボタンが有効になっています。

スクリーンショット 2021-09-06 20.32.30

右下の「プロパティ」ペインには、よく使用されるであろうラベルの付いたボタンがプリセットとして用意されているので、使用したいものにチェックを入れて、すぐに使うことができます。これらのボタンには、QDialogButtonBoxが持つシグナル、acceptedかrejectedのいずれかを送信するようになっています。

ここでは、Close(シグナルはrejected)のみにチェックを入れ、他のボタンはチェックを外します。

スクリーンショット 2021-09-06 20.33.09

なお、「シグナル/スロットエディタ」ペインを見ると、QDialogButtoBoxのaccepted/rejectedシグナルが、ダイアログのaccept/rejectスロットに接続されているのが確認できます。Qt Designerでは、編集中のウィジェット部品であれば、ノーコードでシグナル/スロット接続をすることができます。

スクリーンショット 2021-09-07 7.45.44

前述のQDialogButtonBox内のボタンが、accepted/rejectedのいずれかのシグナルを送信(emit)するようになっていますから、ノーコードのままダイアログのacceptかrejectが実行され、QDialog::execが1か0を返し、その値を元に処理を分岐することができます。

まとめ

Qt CreatorやQt Designerが備える機能と、シグナル/スロット機構により、煩雑で退屈なUI処理をある程度まで軽減してくれるので、開発者のリソースは、その分ビジネスロジックに割くことができます。ぜひとも覚えておきたい機能です。

この記事が気に入ったらサポートをしてみませんか?