「Qtの基礎 - シグナルとスロット」の版間の差分
提供: MochiuWiki : SUSE, EC, PCB
ページの作成:「== 概要 == シグナルおよびスロットの詳細は、以下の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> | ||
2021年2月16日 (火) 15:20時点における版
概要
シグナルおよびスロットの詳細は、以下の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;
}
};