複数レベルの継承で Qt のシグナル/スロット メカニズムを操作しようとすると、問題が発生しました。私のクラスが QObject から直接継承しないと、シグナルとスロットが機能しなくなります。
次のプログラムの出力は、このケースを示しています。
require 'Qt'
class A < Qt::Object
signals 'mySignal()'
slots 'mySlot()'
def initialize
super()
puts "This is the c'tor of A and I am a #{self.class}"
connect(self, SIGNAL('mySignal()'), self, SLOT('mySlot()'))
emit mySignal()
end
def mySlot
puts "Signal received and I am a #{self.class}"
end
end
class B < A
def initialize
super()
end
end
app = Qt::Application.new(ARGV)
A.new
B.new
app.exec
プログラムは
これは A の作成者で、私は A です 信号が受信され、私は A です これは A の作成者で、私は B です
しかし、私は期待します
これは A の作成者で、私は A です 信号が受信され、私は A です これは A の作成者で、私は B です 信号が受信され、私は B です
Qt のドキュメントには、「[...] 最初に継承されたクラスが QObject のサブクラスであると想定されている」と記載されています。B < A < QObject なので、それは正しいと思います。対応する C++ プログラムは期待どおりに動作します (ただし、c++ の c'tor でオブジェクトの型を特定することはできませんが、それはここでの要点ではありません)。
問題は次のとおりです。プログラムが期待どおりの出力を提供しないのはなぜですか?