Ruby';s子类化和Qt';s信号/插槽don';我们不能像预期的那样合作

Ruby';s子类化和Qt';s信号/插槽don';我们不能像预期的那样合作,ruby,qt,qtruby,Ruby,Qt,Qtruby,当尝试在多个继承级别上使用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}"

当尝试在多个继承级别上使用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
require'Qt'
类A
该计划产生了巨大的收益

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 这是A的指挥官,我是A 收到信号,我是a 这是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 这是A的指挥官,我是A 收到信号,我是a 这是A的指挥官,我是B 收到信号,我是B Qt'声明,它“[…]假设第一个继承类是QObject的子类。”。既然B问题是:为什么程序没有给出预期的输出?

为了能够利用信号和插槽——或者更重要的是,Qt中的元对象系统,类必须从QObject继承——并且它必须在多重继承中首先继承QObject。另请参阅,以获得有关元对象系统的详细信息,正如Terence Simpson指出的,这是一个仍然存在于Qt Ruby 1.4.9中的错误。同时它也得到了修复。

谢谢您的回答。我用C++测试了整个事件,并把问题包含在问题中。连接(特别是,A的调用被B调用的调用)失败了吗?如果是,则连接未正确建立,因此信号不会调用插槽。连接似乎已正确建立。如果您尝试使用不存在的信号或插槽,至少Qt不会像通常那样抱怨。我运行了您的示例,得到了您期望的输出,即“接收到的信号,我是B”行。(Ubuntu Jaunty(9.04))也许这是一个已经修复的bug。您使用的是哪个版本的QtRuby?ruby1.8:1.8.7.72-3 libqt4-ruby1.8:4:4.2.2-0ubuntu2