イベントを受け取る

QTのイベント

イベントはボタンやチェックボックスなどのGUIが操作されたときに発生します。

Javaなどではリスナーを使ってイベントを受け取れる仕組みがありますが、QTではリスナーは使わず、eventFilter関数を使います。

たとえば、ボタンが押されたらラベルの内容が変わるようなプログラムを作りたいとします。その場合には初めにイベントを受け取るボタンをinstallEventFilterという関数でイベントに登録し、その後イベント関数である eventFilter を定義し、そのイベントを監視するようにします。それを行っているのが以下のソースです。

MainWin_H.h
#include <QtGui>

class MainWin : public QWidget
{
public:
    MainWin();

protected:
    bool eventFilter(QObject* obj, QEvent* event);

private:
    QPushButton * button1;
    QLabel * label;
};

eventFilterprotected関数として宣言されていますが、これはもしこのクラスを継承したときでもサブクラスから関数を使えるようにするためです。

次がMainWinの定義部分です。

MainWin.cpp
#include "MainWin_H.h"

MainWin::MainWin()
{
    setWindowTitle("window");
    setGeometry(200, 200, 200, 300);
    
    QVBoxLayout* vbox = new QVBoxLayout();

    button1 = new QPushButton(this);
    button1->setText("click!");

    label = new QLabel("hello", this);

    vbox->addWidget(button1);
    vbox->addWidget(label);
    button1->installEventFilter(this);
        //ボタンをイベントに追加

    setLayout(vbox);
    show();
}

/**イベントを受け取る*/
bool MainWin::eventFilter(QObject* obj, QEvent* event)
{
    QEvent::Type type = event->type();
    if(obj == button1){        //もしボタンがイベントを受け取ったら
        if(event->type() == QEvent::MouseButtonPress){
            //ボタンが押されているときの処理
            label->setText("clicked");
            return true;
        }
        if(event->type() == QEvent::MouseButtonRelease){    
            //ボタンが離されているときの処理
            label->setText("released");
            return true;
        }
        if(event->type() == QEvent::MouseButtonDblClick){
            //ボタンがダブルクリックされたときの処理
           label->setText("double clicked");
            return true;
        }
    }else{
        return false;
    }
}

MainWin.cppのコメントが書かれている部分に特に注目してください。そこがイベントに関係しているところです。

eventFilterはただ単に定義するだけでイベントに登録したGUI部品で起こったイベントを受け取れます。

関連項目
プライバシーポリシー