При попытке работать с механизмами сигналов/слотов 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
Программа дает
This is the c'tor of A and I am a A Signal received and I am a A This is the c'tor of A and I am a B
Тем не менее, я ожидал
This is the c'tor of A and I am a A Signal received and I am a A This is the c'tor of A and I am a B Signal received and I am a B
В документации говорится, что "[...] предполагается, что первый унаследованный класс является подклассом QObject.". Поскольку B ‹ A ‹ QObject, я ожидаю, что это будет правдой. Соответствующая программа на С++ ведет себя так, как ожидалось (хотя вы не можете определить тип объекта в его c'tor в С++, но это не главное).
Вопрос: Почему программа не дает ожидаемого результата?