Ruby的子类化和Qt的信号/插槽不能按预期一起工作

时间:2008-11-18 07:37:59

标签: ruby qt qtruby

当试图在多个继承级别上使用Qt的信号/插槽机制时,我遇到了一个问题:当我的类没有直接从QObject继承时,信号和插槽似乎不再起作用了。 / p>

以下程序的输出说明了这种情况:

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

Qt'documentation表示,它“[...]假设第一个继承的类是QObject的子类。”由于B < A&lt; QObject,我希望这是真的。 相应的C ++程序按预期运行(尽管你不能在c ++中识别它的c'tor中的对象类型,但除了这一点之外)。

问题是:为什么程序没有给出预期的输出?

2 个答案:

答案 0 :(得分:1)

为了能够利用信号和插槽 - 或者更重要的是Qt中的元对象系统,该类必须从QObject继承 - 并且它必须首先在多重继承中继承QObject。另请参阅http://doc.trolltech.com/4.4/moc.html以获得有关元对象系统的良好读数

答案 1 :(得分:0)

正如Terence Simpson所指出的,这是一个仍然存在于Qt Ruby 1.4.9中的错误。它在此期间得到了解决。