「Qtの基礎 - シグナルとスロット」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == シグナルおよびスロットの詳細は、以下のWebサイトを参照すること。<br> https://blog.qt.io/jp/2010/07/20/create-signals-and-slots-2…」
 
38行目: 38行目:
     return app.exec();
     return app.exec();
  }
  }
</syntaxhighlight>
<br><br>
== 静的メンバ関数のconnect ==
静的メンバ関数は、インスタンスを生成せずに実行することができる。<br>
通常のメンバ関数の呼び出しと同様、thisからシグナルを発信して、thisでシグナルを受ければよい。<br>
<br>
また、送信側と受信側の両方がthisの場合、受信側インスタンスの指定を省略できるconnectのオーバーロード関数も存在する。<br>
<br>
以下の例では、コンストラクタでシグナルとスロットを接続して、画面が表示された時、showEventメソッドでシグナルをemitしている。<br>
また、送信側のクラスのインスタンスは生成していない。
<syntaxhighlight lang="c++">
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this, &MainWindow::testSignal1, this, &QObjectEx::staticSlot);
    connect(this, &MainWindow::testSignal2, this, &QObjectEx::staticSlot);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::showEvent(QShowEvent *event)
{
    QMainWindow::showEvent(event);
    emit testSignal1(10);
    emit testSignal2(20);
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// MainWindow.h
#pragma once
#include <QMainWindow>
#include "QObjectEx.h"
namespace Ui {class MainWindow;}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void testSignal1(int);
    void testSignal2(int);
protected:
    void showEvent(QShowEvent *) override;
private:
    Ui::MainWindow *ui;
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// QObjectEx.h
#pragma once
#include <QObject>
class QObjectEx : public QObject
{
    Q_OBJECT
public slots:
    static void staticSlot(int i)
    {
      qDebug() << i;
    }
};
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>