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 の作成者で、私は A です
信号が受信され、私は A です
これは A の作成者で、私は B です

しかし、私は期待します

これは A の作成者で、私は A です
信号が受信され、私は A です
これは A の作成者で、私は 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 に答える