Qtの基礎 - シグナルとスロット
ナビゲーションに移動
検索に移動
概要
シグナルおよびスロットの詳細は、以下のWebサイトを参照すること。
https://blog.qt.io/jp/2010/07/20/create-signals-and-slots-2
シグナルとスロット
connect関数を使用して、シグナルとスロットの設定を行う。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
以下に、connenct関数の引数の意味を記載する。
- sender
- 信号が発生するコントロールIDまたはクラスのアドレスを渡す。
- SIGNAL(signal)
- signalに信号とする関数名を渡す。
- 例: プッシュボタンの場合、
SIGNAL(clicked())と記述する。
- receiver
- 信号を受信するコントロールIDまたはクラスのアドレスを渡す。
- SLOT(slot)
- 信号を受信した時に呼び出す関数名を渡す。
connect関数の使用方法
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton* button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
button->show();
return app.exec();
}
静的メンバ関数のconnect
静的メンバ関数は、インスタンスを生成せずに実行することができる。
通常のメンバ関数の呼び出しと同様、thisからシグナルを発信して、thisでシグナルを受ければよい。
また、送信側と受信側の両方がthisの場合、受信側インスタンスの指定を省略できるconnectのオーバーロード関数も存在する。
以下の例では、コンストラクタでシグナルとスロットを接続して、画面が表示された時、showEventメソッドでシグナルをemitしている。
また、送信側のクラスのインスタンスは生成していない。
// 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);
}
// 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;
};
// QObjectEx.h
#pragma once
#include <QObject>
class QObjectEx : public QObject
{
Q_OBJECT
public slots:
static void staticSlot(int i)
{
qDebug() << i;
}
};