つくねの手帳

C++およびAndroidアプリ開発メインで何か書きたい

Qt クリック可能なQLabelの実装と独自シグナル/スロット

QLabelクラスはマウスクリック時動作の関数が用意されていませんが、独自にクリック時のシグナルを作成することでクリック時の動作を行いやすくなります。

// QClickableLabel.h

// QLabelの拡張クラス定義

class QClickableLabel : public QLabel
{
    Q_OBJECT // シグナル/スロット使用に必要

public:
    QClickableLabel();
    ~QClickableLabel();

signals:
    // クリック時に発生させるシグナル
    void clicked();

protected:
    // 左クリック(LButtonDown)時に呼ばれる
    void mousePressEvent(QMouseEvent *e);
};
//QClickableLabel.cpp


void QClickableLabel::mousePressEvent(QMouseEvent *e)
{
    // シグナル送信
    emit cliced();
}


このクラスを使用してLabelを作ることで、クリック時にclicedのシグナルが発生することになります。
connectも以下のようにできます。

// MyClass.h

// クリック可能ラベルクラス前方宣言
class QClickableLabel

class MyClass : public QWidget
{
    Q_OBJECT // シグナル/スロット使用に必要

public:
    MyClass();
    ~MyClass();

public slots:
    // クリック時に呼びたい関数
    void OnClickedLabel();

private:

    QClickableLabel* m_pLabel;
};
// MyClass.cpp

#include "MyClass.h"
#include "QClickableLabel.h"

MyClass::MyClass()
{
    // クリック可能ラベルクラス生成
    this->m_pLabel = new QClickableLabel();

    // m_pLabelのcliced()シグナル発生時に、this(自クラス)のOnClickedLabel()が呼ばれるようにする
    connect(this->m_pLabel , SIGNAL(cliced()) , this , SLOT(OnClickedLabel()));
}

void MyClass::OnClickedLabel()
{
    // クリック時に行う処理
}

installEventFilterとeventFilterでもイベントハンドリングはできます。
しかし、よく使うイベントや、同一クラス内オブジェクトが多く、eventFilterが煩雑化する場合などは、シグナルとスロットを実装したほうがよさそうです。