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

时间:2017-08-04 00:33:46

标签: gtk gtk3

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

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

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

通过修改点击事件的行为并进行一些鼠标点击测试,可能会在源代码中处理这个问题。我还不太清楚如何做到这一点,因为我是gtk的新手,但我希望有一种更简单的方法。

基本扩展器

> label
...

我的扩展器

> label button
...

点击按钮与点击标签或>相同,我不想要。我希望按钮可以用作按钮而不会导致扩展器以任何方式扩展。

1 个答案:

答案 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()

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

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