各種スクリプトでQtシグナルを使う

C++/Perl/Ruby/Pythonにおけるシグナルとスロットの接続、独自シグナルとスロットの定義、独自シグナルの送信に関してまとめるためにサンプルプログラムを作成した。

download:qtsig.tar.gz

上記tarballには以下のファイルが含まれている。

+-- qtsig.tar.gz
    +-- qtsig
        +-- c
        |   +-- makefile
        |   +-- moc_qtsig.cpp
        |   +-- moc_qtsig.o
        |   +-- qtsig
        |   +-- qtsig.cpp
        |   +-- qtsig.h
        |   +-- qtsig.o
        |   +-- qtsig.pro
        +-- qtsig.pl
        +-- qtsig.py
        +-- qtsig.rb


どの言語でも以下の画面が表示される。

「Require Type」には空白(またはany)、dec、real、hex、space、strの何れかを入力し、真ん中の入力ボックスに入力されるものが任意、整数、実数、16進数、空白、文字列の何れかであることを指定する。
「Current Type」には真ん中の入力ボックスに入力されいる内容に合わせて現在のタイプが表示される。
「Require Type」と「Current Type」が同じ場合、「Send」ボタン(またはEnterキー)によって、真ん中の入力ボックスに入力された内容が「Receive Text」に表示される。

スクリプトのシグナルやスロットの扱い方について、以下に補足説明する。詳細はソースコードを参照して欲しい。

Perl

C++に良く似ており、ほとんど違和感がない。

Ruby

標準のシグナルとスロットはQSIGNAL()とQSLOT()によって記述する。
独自シグナルはRSignalクラスによって提供される。

  • 作成:RSignal.new("引き数のプロトタイプ")
  • 送信:.sendWith(引き数)

独自スロットはRubyのメソッドとして実装し、それに連結するにはメソッド名を記述する。

"const QString &"を引き数のプロトタイプとして作成したRSignalオブジェクトは、Rubyのメソッドと連結することができない。QSLOT()による標準のスロットにのみ連結できる。
ただし、"const QString &"を引き数に持つQSIGNAL()による標準シグナルは、Rubyのメソッドと連結することができる。

また、RSignalオブジェクトをレシーバーとして、シグナルのリレーを行うことはできない。
その場合、一旦Rubyのメソッドで受信し、その中でRSignalを送信すれば良い。
シグナルのリレーができるのは、QSIGNAL()による標準シグナルのみである。

Python

標準のシグナルとスロットはSIGNAL()とSLOT()によって記述する。
独自シグナルはPYSIGNAL()によって記述するが、引き数のプロトタイプを指定する必要はない。
独自スロットはPythonのメソッドとして実装し、それに連結するにはインスタンスメソッドを指定する。