使用Ruby中的GTK3定制信号

时间:2016-08-12 20:46:48

标签: ruby gtk signals gtk3

我想从gtk3中的Widget发出自定义信号 在GTK2中,有一个名为signal_new的函数来创建一个新信号 您可以在此处查看示例:https://github.com/ruby-gnome2/ruby-gnome2/blob/ec373f87e672dbeeaa157f9148d18b34713bb90e/glib2/sample/type-register.rb

在GTK3中,似乎此功能不再可用。那么在ruby的GTK3中创建自定义信号的新方法是什么?

1 个答案:

答案 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块的额外参数。