2

当尝试在多个继承级别上使用 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的c'tor,我是A
收到信号,我是 A
这是A的c'tor,我是B

但是,我希望

这是A的c'tor,我是A
收到信号,我是 A
这是A的c'tor,我是B
收到信号,我是 B

Qt 的文档指出,它“[...] 假定第一个继承的类是QObject 的子类。”。由于 B < A < QObject,我希望这是真的。相应的 C++ 程序按预期运行(尽管您无法在 c++ 中识别对象的 c'tor 中的类型,但这不是这里的重点)。

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

4

2 回答 2

1

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

于 2009-01-02T12:35:13.647 回答
0

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

于 2009-06-23T12:34:40.767 回答