QMainWindowを使う
QMainWindowを使うことでメニューやツールバー、ステータスバーなどを簡単に追加できるようになります。
QMainWindowはウィンドウの中央に何かしらのWidgetを配置します。
今回もメモ帳を拡張していきますので、QTextEditを配置します。
このソースコードはQtのインストールディレクトリ以下の次の場所にあります。
Examples/Qt-5.5/widgets/tutorials/gettingStarted/gsQt/part4
プロジェクトファイルをQtCreatorで開いて実行すると、次のウィンドウが表示されます。
QMainWindowを継承したNotepadクラスの定義を見てみます。
#include <QtWidgets>
class Notepad : public QMainWindow
{
Q_OBJECT
public:
Notepad();
private slots:
void load();
void save();
private:
QTextEdit *textEdit;
QAction *loadAction;
QAction *saveAction;
QAction *exitAction;
QMenu *fileMenu;
};
メモを開いたり保存したりできるようにload()とsave()の2つのスロットを選言しています。
load()とsave()の実装は次のセクションで行います。
メニューやツールバーを持ったアプリケーションでは、別々のWidigetが同じスロットを呼び出すことが多々あります。
例えば、メニューの「開く」とツールバーの「開くボタン」はファイルを開くためのスロットを使ったりします。
QActionで仲介させることで、これらのWidgetとスロットを簡単に接続できます。
例えば、QMenuとQToolBarはそれぞれメニューアイテムとツールボタンを同じQActionから作ることができます。
簡単に例を見ていきましょう。
Notepad::Notepad()
{
loadAction = new QAction(tr("&Load"), this);
saveAction = new QAction(tr("&Save"), this);
exitAction = new QAction(tr("E&xit"), this);
connect(loadAction, SIGNAL(triggered()), this, SLOT(load()));
connect(saveAction, SIGNAL(triggered()), this, SLOT(save()));
connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(loadAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator();
fileMenu->addAction(exitAction);
textEdit = new QTextEdit;
setCentralWidget(textEdit);
setWindowTitle(tr("Notepad"));
}
前回と同じようにNotepadクラスのコンストラクタでGUIの設定を行っています。
QActionはWidgetに表示する文字列を引数にして生成します。
この場合はメニューアイテムなので文字列だけですが、ツールボタンなどのために、アイコンもコンストラクタ引数に設定できます。
これでメニューアイテムを選択するとアクションがトリガーとなってスロットが呼び出されるようになります。