【问题标题】:gtk expander with complex expander widgets具有复杂扩展器小部件的 gtk 扩展器
【发布时间】:2017-08-05 07:44:55
【问题描述】:

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

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

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

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

基本扩展器

> label
...

我的扩展器

> label button
...

单击按钮与单击标签或 > 相同,这是我不想要的。我希望按钮起到按钮的作用,并且不会导致扩展器以任何方式展开。

【问题讨论】:

    标签: gtk gtk3


    【解决方案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()
    

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

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

    【讨论】:

    • 谢谢,我想它需要这样的东西。没有测试过,但似乎是这样。因为这个原因,我实际上已经离开了扩展器,因为它除了扩展功能之外没有提供任何额外的功能,无论如何我都必须处理其他一些视觉原因(我想在应用程序不使用时自动收缩,所以它将根据计时器“展开”)。再次感谢!
    • 只是重申带有True 和False 值的条件返回将具有相同的行为。谢谢。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多