6

ユーザーが のヘッダー行を右クリックしたときに、コンテキスト メニューをポップアップ表示したいと考えていますGtk.TreeView。GTK3 にGtk.TreeViewColumnは、これを簡単にする get_button() メソッドがあります。メニューをボタンにアタッチし、それを「クリック」イベントに接続するだけです。ただし、GTK2 では、これは機能しません。get_widget()経由でウィジェットを設定していない場合は、None を返すメソッドのみを呼び出すことができますset_widget()Gtk.Label列名を含む を に入れ、Gtk.EventBoxそれをウィジェットとして設定しようとしましEventBoxた。 を 'button_press_event' のコールバックに接続した後、それをクリックしてもイベントは生成されません。

ここにリストされているようなことをしようとしましたがget_parent()、列ウィジェットで実行すると None が返され、コードが示すようにボタンに到達しません。

人々はこれに対してどのような解決策を見つけましたか?

4

3 に答える 3

3

これは実際には非常に簡単ですが、いくつかのハックが必要です。

まず、GtkTreeViewColumn のヘッダー ボタンを作成するように Gtk に強制する必要があります。

    label = gtk.Label("Column title")
    label.show()
    treeview_column.set_widget(label)

その後、ヘッダーの内部 GtkButton をフェッチする必要があります。

    widget = treeview_column.get_widget()
    while not isinstance(widget, gtk.Button):
        widget = widget.get_parent()

最後に、ボタン参照を使用すると、何か便利なことを行うことができます。

    def button_release_event(button, event):
        if event.button == 3:
           menu.popup(event)

    widget.connect('button-release-event', button_release_event)

これは、GtkTreeViewsを作成するための api のような Python リストを提供するObjectListを持つkiwiライブラリから取得されました。

于 2011-09-28T09:17:48.670 に答える
0

これは確かに複雑に思えます。ソースを見てみました。どうやらparentトリックは機能します (そして配置オブジェクトを返します) が、カスタム ラベルは TreeviewColumn が認識された後にのみボタンに追加されるため、その前にparent属性が保持されるため、Noneおそらく Treeview の show コマンドの後に最新の状態になるはずです。親を取得し (Button->HBox->Alignment->Label)、ハンドラーをシグナルにアタッチできます。

于 2011-09-16T17:58:05.230 に答える