ホーム

OFF-SOFT.net

OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

Qt (2) シグナルとスロットを調べる

公開日| 2009年05月21日 | コメントはまだありません。
コマンドシグナルとアップデイトシグナル
ここでは、メニューのアップデートとメニューのクリックでのシグナルとスロットを作成してみましょう。

便宜上、メニューのクリックのシグナルをコマンドシグナルと呼びます。メニューのアップデートの時のシグナルをアップデイトシグナル と呼びます。

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クラスリファレンス:http://doc.trolltech.com/4.5/classes.html


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


コメント

コメントをどうぞ







  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ