MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - シグナルとスロットのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - シグナルとスロット
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == シグナルおよびスロットの詳細は、以下のWebサイトを参照すること。<br> https://blog.qt.io/jp/2010/07/20/create-signals-and-slots-2<br> <br><br> ==シグナルとスロット == connect関数を使用して、シグナルとスロットの設定を行う。<br> <syntaxhighlight lang="c++"> connect(sender, SIGNAL(signal), receiver, SLOT(slot)); </syntaxhighlight> <br> 以下に、connenct関数の引数の意味を記載する。<br> * sender *: 信号が発生するコントロールIDまたはクラスのアドレスを渡す。 * SIGNAL(signal) *: signalに信号とする関数名を渡す。 *: 例: プッシュボタンの場合、<code>SIGNAL(clicked())</code>と記述する。 * receiver *: 信号を受信するコントロールIDまたはクラスのアドレスを渡す。 * SLOT(slot) *: 信号を受信した時に呼び出す関数名を渡す。 <br><br> == connect関数の使用方法 == <syntaxhighlight lang="c++"> #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(); } </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> <br><br> == Qt Designerで設定したシグナルおよびスロット == Qt Designerで設定したシグナルおよびスロットは、<code>connect</code>関数を使用せずに呼び出すことができる。<br> <br> ソースコード上で<code>connect</code>関数を使用せずにスロット関数が呼び出される理由を以下に示す。<br> まず、<code>QWidget</code>クラスや<code>QMainWindow</code>クラス等を継承した派生クラスにおいて、コンストラクタに自動生成されるソースコードで、以下の記述がある。<br> ui->setupUi(this); <br> 次に、<code>setupUi</code>メソッドの定義の最後に、以下の記述がある。<br> 以下に示す<code>QMetaObject::connectSlotsByName</code>メソッドは、オブジェクト(引数)が持つ全てのスロットに対して、<br> <code>on_<子オブジェクト名>_<子オブジェクトのシグナル名></code>を満たすスロット名の存在を確認する。<br> <syntaxhighlight lang="c++"> void setupUi(QMainWindow *MainWindow) { // ...略 QMetaObject::connectSlotsByName(MainWindow); } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - シグナルとスロット
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse