看起来动作和信号很相似。他们之间有什么区别吗?行动比信号更高层次?
例如,我想按一个按钮来做某事, 我可以使用行动:
<object class="GtkButton">
<property name="label">Start</property>
<property name="action-name">app.start</property>
</object>
class xxxApplication(Adw.Application):
def on_button_clicked(self,widget,_):
print('Button pressed.')
def create_action(self):
action = Gio.SimpleAction.new("start", None)
action.connect("activate", self.on_button_clicked)
我也可以直接使用信号:
<object class="GtkButton">
<property name="label">Start</property>
<signal name="clicked" handler="on_button_clicked"/>
</object>
class xxxWindow(Adw.ApplicationWindow):
@Gtk.Template.Callback()
def on_button_clicked(self, button):
print('Button pressed.')
虽然最终结果相同,但actions和signals有一些差异。主要区别之一是可以向 actions 添加快捷方式,但不能向 signals 添加快捷方式,至少不能直接添加。另一个重要的区别是actions可以直接在菜单项上使用,而signals更难使用。
一般来说,actions是在整个应用程序中考虑重用而设计的,而signals则用于更具体的情况。如果您需要由键盘快捷键、菜单项和按钮触发的功能,您可以使用三个 signal 或单个 action 来解决此问题。
传递给函数的参数也有差异,从这个意义上说,signals比actions更灵活。