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、画面に表示されません。GtkEntryとカスタムウィジェット(hexpand、vexpand、margins、alignsなど)のプロパティのさまざまな組み合わせを試しましたが、役に立ちませんでした。
  • 他のウィジェットと組み合わせると、ウィジェットに割り当てられた高さをインタラクティブに照会すると、明らかに1になります。画面上では、ウィジェットは事実上表示されません(他のウィジェット間で多少「押しつぶされている」ため)。

それで、オブジェクトの初期化に欠けているものがありますか、それともこのカスタムウィジェットをどのように使用していますか?これは固有の問題GtkBinですか?で同じことを試してみましたが、問題なく動作しますが、この特定のウィジェットに適している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方が適切だと思います。これは、スタイル設定可能な境界線が周囲にある 1 つの子コンテナーです。そして、そのサイズ割り当て方法が機能します。

于 2013-01-12T14:53:21.987 に答える