使用Ruby中的GTK3自定义信号

0xA*_*ffe 6 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中创建自定义信号的新方法是什么?

Aar*_*sen 4

GTK3改为使用define_signal方法而不是signal_new. 该方法在类级别调用(很像类似的东西attr_accessor)。

这是一个示例类,使用名为 的自定义信号example。我根据GitHub 存储库上的示例glib2改编了此内容。

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
Run Code Online (Sandbox Code Playgroud)

默认情况下,信号的处理程序块接受一个参数,该参数是发出信号的对象。如果您希望信号使用其他参数,您可以将额外的参数define_signal及其类型传递给。

配置完信号后,您可以使用以下命令发出它signal_emit

example = ExampleClass.new
example.signal_emit('example')
Run Code Online (Sandbox Code Playgroud)

如果有其他参数要传递,它们的值可以作为额外参数传递给signal_emit.

该信号可以像任何其他 GTK3 信号一样连接到,使用signal_connect

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')
Run Code Online (Sandbox Code Playgroud)

这会输出类似以下内容:

Handler 1, sent by #<ExampleClass:0x0000564d436331e8>
Handler 2, sent by #<ExampleClass:0x0000564d436331e8>
Run Code Online (Sandbox Code Playgroud)

同样,如果您的信号使用其他参数,它们将是传递到signal_connect's 块的额外参数。

  • [glib2: add GLib::Object.define_signal](https://github.com/ruby-gnome2/ruby-gnome2/commit/919d92c3f6e97cc2aeac661390890eb1a7c3a3f5) 是添加此内容的提交。好发现! (2认同)