2017-08-04 59 views
1

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

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

看起来,扩展器拦截按钮上的点击事件,而不是让它们落到按钮上(不知道它们是否也在反应)。

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

基本扩展

> label 
... 

我的扩展

> label button 
... 

点击按钮做同样的点击标签或>,我不想上。我希望按钮作为按钮使用,不会导致扩展器以任何方式扩展。

回答

1

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

为了达到这个目的,您需要将信号连接到扩展器,比如button-press-event,并返回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() 

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

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

+0

谢谢,我想它会需要类似的东西。没有测试过,但似乎是这样。实际上我已经离开了扩展器,因为它实际上并没有提供额外的功能,除了扩展功能外,我必须处理其他一些视觉原因(我想在应用程序未使用时自动收缩,所以它将根据计时器“延长”)。再次感谢! – AbstractDissonance

+0

只是为了重申一个带有“True”和“False”值的条件返回将具有相同的行为。谢谢。祝你好运。 –