Im using qtbindings for Ruby (https://github.com/ryanmelt/qtbindings) and i would emit a signal with an hash param...
Something like this:
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
开发者_如何学Co.emit_my_signal
If I run this script I get the error: Cannot handle 'Hash' as slot
argument (ArgumentError).
If I use int
instead of Hash
everything is fine.
There is a way to do this?? How?
Thanks.
Ok, I've found a solution:
pass the string of the Ruby Object ID... Not use the ID as Fixnum because Ruby Fixnum objects may be up to 62 bits, but C ints are 32 bit.
When you get the object id you can try to retrieve the object with ObjectSpace._id2ref(object_id_as_string.to_i)
.
My solution code:
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
May be that the garbage collector go to destroy the hash object and the attempt to retrieve the object fail...
精彩评论