Сигнальный слот QT Ruby bindings с хеш-параметром - PullRequest
2 голосов
/ 03 октября 2011

Я использую qtbindings для Ruby (https://github.com/ryanmelt/qtbindings), и я бы испустил сигнал с хеш-параметром ...

Что-то вроде этого:

require 'Qt'

class Foo < Qt::Object

  signals 'my_signal(Hash)'
  slots 'my_slot(Hash)'

  def initialize(parent = nil)
    super(parent)
    connect(self, SIGNAL('my_signal(Hash)'), self, SLOT('my_slot(Hash)'))
  end

  def emit_my_signal
    emit my_signal({:foo => :bar})
  end

  def my_slot(hash)
    puts hash.inspect
  end
end

o = Foo.new
o.emit_my_signal

Если я запускаю этот скрипт, яполучите ошибку: Cannot handle 'Hash' as slot argument (ArgumentError). Если я использую int вместо Hash, все в порядке.

Есть способ сделать это ?? Как?

Спасибо.

1 Ответ

1 голос
/ 04 октября 2011

Хорошо, я нашел решение: передать строку идентификатора объекта Ruby ... Не использовать идентификатор в качестве Fixnum, потому что объекты Ruby Fixnum могут иметь длину до 62 бит, но C-биты 32-битные. Когда вы получите идентификатор объекта, вы можете попытаться получить объект с помощью ObjectSpace._id2ref(object_id_as_string.to_i).

Код моего решения:

require 'Qt'

class Foo < Qt::Object

  signals 'my_signal(const QString&)'
  slots 'my_slot(const QString&)'

  def initialize(parent = nil)
    super(parent)
    connect(self, SIGNAL('my_signal(const QString&)'), self, SLOT('my_slot(const QString&)'))
  end

  def emit_my_signal
    emit my_signal({:foo => :bar}.object_id.to_s)
  end

  def my_slot(object_id)
    hash = ObjectSpace._id2ref(object_id.to_i)
    puts hash.inspect
  end
end

o = Foo.new
o.emit_my_signal

Может быть, сборщик мусора отправляется на уничтожение хеш-объекта, и попытка получить объект не удалась ...

...