シグナルとスロットの仕組み
シグナルとスロット
QTではイベントを実装する方法の1つにシグナルとスロットを使う方法があります。
シグナルはイベントが起きたときに発生する関数、スロットはシグナルが送られたときに実行する関数のことです。
たとえば、以下のような使い方をします。
QPushButton * button = new QPushButton(tr("action"), this); connect(button, SIGNAL(pressed()), this, SLOT(close()));
ここでSIGNALで囲まれた関数がQActionが押されたときに発生するシグナル関数、SLOTで囲まれた関数がスロット関数です
そしてconnect関数でボタンクリックを表すpressed関数をSIGNALマクロでシグナルにし、close関数をSLOTマクロでスロットにしています。
使い方の例
それでは実際にメニューにシグナルとスロットを使ってイベントを登録してみます。
その例が次のソースファイルです。
MainWin_H.h#ifndef MAIN_WIN_H #define MAIN_WIN_H #include <QtGui> class MainWin : public QMainWindow{ Q_OBJECT //シグナルとスロットを使うときには必須 public: MainWin(); //スロットの宣言 private slots: void close(); private: void makeMenu(); QMenu * menu; QAction * actionExit; }; #endif
Q_OBJECTというマクロがありますが、これはシグナルとスロットを扱う際には必須なので必ず書くようにしてください。
そして次に private slots: というアクセス指定子がありますが、この指定子内の関数をスロットにするために必要なものなので、これも必ず書いてその後にスロットになる関数を宣言します。
#include <QtGui> #include "MainWin_H.h" MainWin::MainWin() { makeMenu(); setWindowTitle("signal and slot"); setGeometry(200, 200, 200, 300); } void MainWin::makeMenu() { //イベントを作成する。 actionExit = new QAction(tr("終了"), this); connect(actionExit, SIGNAL(triggered()), this, SLOT(close())); //シグナルとスロットを登録 menu = menuBar()->addMenu(tr("&file")); QMenu* menuFile = menu1->addMenu(tr("ファイル")); menuFile->addAction(actionExit); }
定義部分ではメニューにQActionを作り、それに対してconnect関数でシグナルとイベントを登録しています。
ここではメニューの「Exit」が押されたらアプリケーションを終了するようにしています。
もし、イベントを登録したのにうまく動かない場合は qmake で新しくメイクファイルを作リ直してみてください。上手くいくことがあります。
シグナルの引数をスロットに渡す方法
SIGNALに渡した関数がなにか引数をとるような場合、その値をスロット関数に渡すには次のようにシグナルと同じ型をスロット関数に渡します。
connect(lineEdit, SIGNAL(textEdited(const QString &)), lineEdit2, SLOT(setText(setText(const QString &))));
ラインエディットが2つあるような場合で一方(lineEdit)が編集されたらtextEditedシグナル関数が呼ばれ、もう一方(lineEdit2)のエディットにsetTextでテキストをセットしています。
この場合のようにシグナルとスロットに全く同じ型を渡してあげればOKです。
以上、シグナルとスロットについて簡単にまとめてみました。では、また!