gpt4 book ai didi

ruby - 在 Ruby 中使用 GTK3 自定义信号

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:25 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

一旦你配置了一个信号,你就可以使用 signal_emit 发射它:

example = ExampleClass.new
example.signal_emit('example')

如果有额外的参数要传递,它们的值可以作为额外的参数传递给 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')

这将输出如下内容:

Handler 1, sent by #<ExampleClass:0x0000564d436331e8>
Handler 2, sent by #<ExampleClass:0x0000564d436331e8>

同样,如果您的信号使用额外的参数,它们将是传递给 signal_connect block 的额外参数。

关于ruby - 在 Ruby 中使用 GTK3 自定义信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com