我想从gtk3中的Widget发出自定义信号
在GTK2中,有一个名为signal_new
的函数来创建一个新信号
您可以在此处查看示例:https://github.com/ruby-gnome2/ruby-gnome2/blob/ec373f87e672dbeeaa157f9148d18b34713bb90e/glib2/sample/type-register.rb
在GTK3中,似乎此功能不再可用。那么在ruby的GTK3中创建自定义信号的新方法是什么?
答案 0 :(得分:3)
GTK3更改为使用define_signal
方法而不是signal_new
方法。在类级别调用此方法(类似于attr_accessor
之类的方法。)
这是一个示例类,使用名为example
的自定义信号。我是从sample on the glib2
GitHub repo改编而成的。
class ExampleClass < GLib::Object
# To use define_signal, the class must first be registered with GLib's
# type hierarchy.
type_register
# This declares the custom signal.
define_signal(
'example', # signal name
nil, # flags (combination of GLib::Signal's constants)
nil, # accumulator; apparently not supported
nil # signal return type, where nil is void
)
end
默认情况下,信号的处理程序块接受一个参数,该参数是发出信号的对象。如果您希望信号使用其他参数,则可以将其他参数及其类型传递给define_signal
。
配置信号后,可以使用signal_emit
发出信号:
example = ExampleClass.new
example.signal_emit('example')
如果还有其他参数要传递,则可以将它们的值作为其他参数传递给signal_emit
。
使用signal_connect
,可以将该信号与其他GTK3信号连接起来:
e = ExampleClass.new
e.signal_connect('example') do |sender|
puts "Handler 1, sent by #{sender}"
end
e.signal_connect('example') do |sender|
puts "Handler 2, sent by #{sender}"
end
e.signal_emit('example')
这将输出如下内容:
Handler 1, sent by #<ExampleClass:0x0000564d436331e8> Handler 2, sent by #<ExampleClass:0x0000564d436331e8>
同样,如果您的信号使用其他参数,它们将是传递给signal_connect
块的额外参数。