我有一个扩展器,它不是使用标签,而是有一个带有按钮和标签的盒子,有点像工具栏。问题是,当我与这些小部件进行交互时,会激活扩展器。
基本上我希望扩展器仅在我实际点击箭头时起作用,而不是箭头左侧的东西...或者,甚至可能是首选,而不是按钮或其他可点击的表面。
似乎扩展器拦截了按钮上的点击事件,而不是让它们落到按钮上(不确定它们是否也有反应)。
通过修改点击事件的行为并进行一些鼠标点击测试,可能会在源代码中处理这个问题。我还不太清楚如何做到这一点,因为我是gtk的新手,但我希望有一种更简单的方法。
基本扩展器
> label
...
我的扩展器
> label button
...
点击按钮与点击标签或>相同,我不想要。我希望按钮可以用作按钮而不会导致扩展器以任何方式扩展。
答案 0 :(得分:1)
我已尝试过您的方法,如果您将信号连接到按钮,您将无法获得您正在搜索的行为。
为此,您需要将信号连接到扩展器,比如说button-press-event
并返回True以避免信号传播。
执行此操作,您将能够避免扩展器扩展并最终控制扩展时的情况。
Glade文件(expand.ui):
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkExpander" id="expander1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Action 1</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Action 2</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Action 3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkButton" id="menub">
<property name="label" translatable="yes">Menu</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="width_request">400</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
某些逻辑的Python代码:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
def onMenuButtonPress(self, widget):
#uncomment below to recreate the original behavior
#expander.set_expanded(not expander.get_expanded())
return True
builder = Gtk.Builder()
builder.add_from_file("expander.ui")
window = builder.get_object("window1")
menu = builder.get_object("menub")
expander = builder.get_object("expander1")
expander.connect("button-press-event", onMenuButtonPress)
window.connect ("destroy", Gtk.main_quit)
window.show_all()
Gtk.main()
如果您运行代码,您将看到按钮按下不会展开扩展器。然而,按键将(需要处理按键事件等)
取消注释代码上的指示行以重新创建内在行为。