具有复杂扩展器小部件的 gtk 扩展器

gtk expander with complex expander widgets

我有一个扩展器,它没有使用标签,而是有一个带有按钮和标签的框,有点像工具栏。问题是当我与这些小部件交互时,扩展器反而被激活了。

基本上我希望扩展器仅在我实际单击箭头时起作用,而不是箭头左侧的东西...或者,甚至可能更喜欢按钮或其他可单击表面。

扩展器似乎拦截了按钮上的点击事件,而不是让它们落到按钮上(不确定它们是否也有反应)。

这可能可以在源代码中通过修改点击事件的行为并进行一些鼠标点击测试来解决。我不太确定如何执行此操作,因为我是 gtk 的新手,但我希望有更简单的方法。

基本扩展器

> label
...

我的扩展器

> label button
...

点击按钮与点击标签或 > 的效果相同,我不希望这样。我希望按钮作为按钮使用,而不会使扩展器以任何方式扩展。

我已经尝试过你的方法,如果你将信号连接到按钮,你将不会得到你正在搜索的行为。

为此,您需要将信号连接到扩展器,比方说,使用 button-press-event 和 return True 以避免信号传播。

这样做可以避免扩容器扩容,最终控制扩容时间

空地文件(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()

如果您 运行 代码,您会发现按下按钮不会展开扩展器。虽然按键会(需要处理按键事件等)

取消注释代码中指示的行以重新创建内在行为。