1

我正在尝试制作一个类似于 Gtk 在所有类似 TreeView 的小部件上使用的“快速搜索”条目的自定义小部件。

这是我最初想法的简化示例:

from gi.repository import Gtk

class QuickSearch(Gtk.Bin):
    def __init__(self, *args, **kwargs):
        super(QuickSearch, self).__init__(*args, **kwargs)
        self.add(Gtk.Entry())

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
search = QuickSearch()
win.add(search)
win.show_all()
Gtk.main()

问题如下:

  • 如果我单独使用它,就像在这个例子中一样,似乎有空间分配给自定义小部件,但GtkEntry屏幕上没有显示。我尝试了和自定义小部件(hexpand、vexpand、边距、对齐等)的各种属性组合,GtkEntry但无济于事。
  • 如果与其他小部件结合使用,当我交互式查询小部件分配的高度时,它显然是 1。在屏幕上,小部件实际上不会出现(因为它在其他小部件之间有点“挤压”)。

那么,我在对象初始化或我如何使用这个自定义小部件时缺少一些东西?这是特定于 的问题GtkBin吗?我尝试用 a 做同样的事情,GtkBox并且完美无缺,但我认为GtkBin更适合这个特定的小部件。

4

1 回答 1

3

出于某种原因,Gtk.Bin没有为其孩子分配空间。如果您实现do_size_allocate虚拟方法,那么它可以工作。为什么不调用默认实现,我不知道。

from gi.repository import Gtk, Gdk

class QuickSearch(Gtk.Bin):
    def __init__(self, *args, **kwargs):
        super(QuickSearch, self).__init__(*args, **kwargs)
        self.add(Gtk.Entry())

    def do_size_allocate(self, allocation):
        self.set_allocation(allocation)
        child_allocation = Gdk.Rectangle()
        border_width = self.get_border_width()
        child_allocation.x = allocation.x + border_width
        child_allocation.y = allocation.y + border_width
        child_allocation.width = allocation.width - 2 * border_width
        child_allocation.height = allocation.height - 2 * border_width
        self.get_child().size_allocate(child_allocation)

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
search = QuickSearch()
win.add(search)
win.show_all()
Gtk.main()

但是,我认为从 a 继承Gtk.Frame更适合您的目的;它是一个带有样式边框的单子容器,这是您想要的以及更多。它的大小分配方法有效。

于 2013-01-12T14:53:21.987 回答