Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

シグナル/スロット

Qtでstaticメンバ関数にconnectする

投稿日:

Qtでstaticなスロット関数にconnectした時のメモ。

staticメンバ関数はインスタンスを生成せず呼ぶことが出来るので、connectする時の受信側インスタンス(第三引数)に何を指定すればいいのかと悩んでいましたが・・・
実質普通の関数呼び出しに等しいので、thisからシグナルを発信して、thisでシグナルを受ければ良いだけのよう。

また、送り側と受け側がともにthisの時に、受信側インスタンスの指定を省略できるconnectのオーバーロード関数もあります。

 

サンプル

コンストラクタでconnectし、ウィジェットが表示された時にshowEvent内でemitするサンプル。
Testクラスのインスタンスは一切生成していません。

#include <QtDebug>
#include "widget.h"
#include "ui_widget.h"

void Test::staticSlot(int i)
{
    qDebug() << i;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this, &Widget::testSignal1, this, &Test::staticSlot);
    connect(this, &Widget::testSignal2, &Test::staticSlot);
}

void Widget::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
    emit testSignal1(10);
    emit testSignal2(20);
}

Widget::~Widget()
{
    delete ui;
}

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Test : public QObject
{
    Q_OBJECT

public slots:
    static void staticSlot(int);
};

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

signals:
    void testSignal1(int);
    void testSignal2(int);

protected:
    void showEvent(QShowEvent *) override;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

 

10
20

 

-シグナル/スロット
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.