Подклассы Ruby и сигналы/слоты Qt не работают вместе, как ожидалось

При попытке работать с механизмами сигналов/слотов 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 в С++, но это не главное).

Вопрос: Почему программа не дает ожидаемого результата?


person Tom    schedule 18.11.2008    source источник
comment
Соединение (в частности, вызов, откуда A вызывается ctor B) терпит неудачу? Если это так, соединение не установлено должным образом, поэтому сигнал не будет вызывать слот.   -  person strager    schedule 06.01.2009
comment
Соединение, кажется, правильно установлено. По крайней мере, Qt не жалуется, как обычно, если вы пытаетесь использовать несуществующие сигналы или слоты.   -  person Tom    schedule 06.01.2009
comment
Я запустил ваш пример и получил результат, который вы ожидали, то есть полученный сигнал, а я - линия B. (Убунту Веселый (9.04))   -  person Terence Simpson    schedule 24.05.2009
comment
Возможно, это ошибка, которую исправили. Какую версию QtRuby вы используете?   -  person Tom    schedule 25.05.2009
comment
ruby1.8: 1.8.7.72-3 libqt4-ruby1.8: 4:4.2.2-0ubuntu2   -  person Terence Simpson    schedule 25.05.2009
comment
Хорошо, я использую 1.4.9. Судя по всему, это ошибка, которую исправили. закрою вопрос.   -  person Tom    schedule 23.06.2009


Ответы (2)


Чтобы иметь возможность использовать сигналы и слоты — или, что более важно, систему метаобъектов в Qt, класс должен наследоваться от QObject — и он должен сначала наследовать QObject при множественном наследовании. См. также http://doc.trolltech.com/4.4/moc.html для хорошее чтение о системе метаобъектов

person Henrik Hartz    schedule 02.01.2009
comment
Спасибо за ответ. Я проверил все это на С++ и включил результаты в вопрос. - person Tom; 06.01.2009

Как указал Теренс Симпсон, это ошибка, которая все еще присутствовала в Qt Ruby 1.4.9. Тем временем это было исправлено.

person Tom    schedule 23.06.2009