Qt (2) シグナルとスロットを調べる
コマンドシグナルとアップデイトシグナル
ここでは、メニューのアップデートとメニューのクリックでのシグナルとスロットを作成してみましょう。
便宜上、メニューのクリックのシグナルをコマンドシグナルと呼びます。メニューのアップデートの時のシグナルをアップデイトシグナル
と呼びます。
QtはGUIライブラリですので、次に画面でサンプルを作成してみましょう。
同じようにサンプルファイルを3つ準備します。
- sample.cpp
-- mainルーチンです。
- mainwindow.h
-- QWidget継承クラスヘッダです。
- mainwindow.cpp
-- QWidget継承クラスソースです。
同じように、QWidget(QObject)継承のクラスは、必ず、ヘッダとソースに分離しなければなりません。mocが正しく認識しません。
では、それぞれのソースコードを見てみましょう。
[mainwindow.h]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow();
private slots:
void updateMenus();
private:
QMenuBar *m_menu;
QMenu *m_fileMenu;
QAction *m_exit_act;
bool m_active;
};
#endif
|
今回は、メニューを作成しますので、QMenuBar,QMenu,QActionが追加されています。
m_activeは、メニューアイテムを有効・無効にするための状態フラグです。
[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #include "mainwindow.h"
MainWindow::MainWindow()
{
m_menu = new QMenuBar( this );
m_fileMenu = m_menu->addMenu(tr("&File"));
m_exit_act = m_fileMenu->addAction("E&xit" );
m_exit_act->setShortcut(tr("Ctrl+Q"));
m_exit_act->setStatusTip(tr("Exit the application"));
connect(m_exit_act, SIGNAL(triggered()),
qApp, SLOT(closeAllWindows()));
connect(m_fileMenu, SIGNAL(aboutToShow()),
this, SLOT(updateMenus()));
setWindowTitle(tr("SampleWindow"));
m_active=true;
}
void MainWindow::updateMenus()
{
m_exit_act->setEnabled(m_active);
m_active=!m_active;
}
|
5行目で、メニューバーを作成します。メニュー全体を管理するウィジェットです。
7行目で、メニューバーに"File"というポップアップメニューを追加します。
9行目から、"File"というポップアップメニューに"Exit"というメニューアイテムを追加します。
昔は、MFCと同じようにIDなどで管理できるようになっていましたが、現在では、アクションアイテムで
管理するようになっています。IDでもできなくはないのでしょうが、ここは、流れにそってアクションアイテムで
管理するようにしています。
MFCより、VCLに近い感じでしょうか。VCLを使ったC++でもこんな感じでしたね。
13行目は、メニューの"Exit"をクリックした時、qAppの"closeAllWindows"というメソッドを起動する宣言をしています。
つまり、コマンドシグナルとその対応するスロットを定義しています。
15行目は、ポップアップメニューの"File"を表示した時、このオブジェクト(this)の"updateMenus"というメソッドを起動する宣言をしています。
つまり、アップデイトシグナルとその対応するスロットを定義しています。
qAppは、MFCで言うところのAfxGetApp() と同じようなものです。
MFCでは、唯一のCWinAppもしくはCWinAppを継承したオブジェクトが生成された後でないと、正しくオブジェクトを取り出せません。
Qtも同じです。QApplicationがそれに相当します。この実態がないと、qAppは空です。
以下のmainの中で、最初にQApplicationを生成しているのは、そのためでもあります。
23行目からは、ポップアップメニュー"File"が表示されるたびにメニューアイテム"Exit"を有効・無効にトグルで切り替えています。
[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
| #include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
return app.exec();
}
|
ここは、説明は必要ないかと思います。単純にアプリケーションを作って、画面を作って表示だけです。
さあ、実行してみましょう。
以下のように、メニューの"Exit"が有効・無効が表示する度に切り替わると思います。

もっと、Qt関連について詳しく知りたい方は、以下の本なども良いと思います。
Qtに関する日本語の本が少ないですね。「入門書」は、さすがに、このページを読まれるくらいの方は不要だと思います。
やっぱり、本+ネット+試してみる!!の3本柱でやっていく以外にないように思います。
コメントをどうぞ