Qtの基礎 - シグナルとスロット

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2021年2月16日 (火) 15:20時点におけるWiki (トーク | 投稿記録)による版 (→‎connect関数の使用方法)
ナビゲーションに移動 検索に移動

概要

シグナルおよびスロットの詳細は、以下の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;
    }
 };