web-dev-qa-db-ja.com

Gtk.SelectionMode.MULTIPLEは、Gtk.TreeViewの1行のみの選択を許可します

Quicklyを使用してアプリケーションを開発しています。モデルとしてGtk.ListStoreを持つGtk.TreeViewがあります。 Gtk.SelectionModeの選択モードはGtk.SelectionMode.MULTIPLEに設定されます。

問題は、Gtk.SelectionModeが次のように動作しないことです。

  • 一度に選択できる行は1つだけです。
  • CtrlキーまたはShiftキーを使用して複数の行を選択することはできません。
  • 行を選択すると、Ctrlキーを使用してその行を選択解除することはできません。
  • 矢印キーを押しても何も起こりません。

この問題は、Quicklyを使用して新しいUbuntuアプリケーションを作成することで簡単に再現できます(または、以下のテストアプリケーションをダウンロードできます)。

_$ quickly create ubuntu-application test
$ cd test
$ quickly design
_

ListStoreをモデルとしてTreeViewを作成します。 GtkTreeSelectionのモードを「複数」に設定します。 ListStoreにいくつかの列と値を追加します。 CellRendererTextsを含むTreeViewColumnsをTreeviewに追加します。

_$ quickly run -v
_

複数の行を選択することはできません。

私はすでに試しましたが、何も変更しませんでした:

  • コードで選択モードを設定します。

    self.ui.selection.set_mode(Gtk.SelectionMode.MULTIPLE)

    または

    self.ui.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)

  • UIファイルのGtkTreeViewColumn _<child>_の下にGtkTreeSelection _<child>_を移動します。

  • UIファイルからGtkTreeSelectionを削除し、選択を設定する

    self.ui.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)

私は明らかなものを見落としているのですか?それともバグかもしれませんか?

余談ですが、選択を「単一」に設定した場合、行の選択を解除することもできません。

[〜#〜]編集[〜#〜]

私を助けたいなら、あなたはテストアプリケーションをダウンロードすることができます ここに 自分ですばやくプロジェクトを作成する代わりに。実行するには、Quicklyが必要です。

_$ cd test
$ quickly run
_

Test/test/TestWindow.pyにテスト目的でいくつかのコールバックを実装しました。 UI定義はtest/data/ui/TestWindow.uiにあります。

1
tectux

私は自分の問題の解決策を見つけました。

Gtk.TreeViewの 'can-focus' プロパティは、デフォルトでFalseに設定されています。これをTrueに設定すると、奇妙な選択動作や、'resizable'プロパティがTrueに設定されているときに列のサイズを変更できないなど、発生する可能性のある他の奇妙な動作が修正されます。

0
tectux

完全な答えを出すことはできませんが、共有したかったのです。プログラミングの質問をする場合は、常に最小限の実用的な例を含めてください。そうすることで、他の人があなたのコードをすばやく実行してテストできるようになります。 Quicklyをインストールし、Quicklyプロジェクトを作成し、コードを変更して、質問の内容を確認して修正する必要がありますが、これは行いません。

そうは言っても、これは正しく動作する最小限の動作例です。そのため、私の動作は、この動作をオーバーライドする魔法をどこかですばやく実行することになると思います。

from gi.repository import Gtk

class TestWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.resize(400, 400)
        self.connect("delete-event", Gtk.main_quit)

        ls = Gtk.ListStore(str)
        ls.append(["Testrow 1"])
        ls.append(["Testrow 2"])
        ls.append(["Testrow 3"])
        tv = Gtk.TreeView(ls)
        tr = Gtk.CellRendererText()
        col = Gtk.TreeViewColumn("Testcolumn", tr, text=0)
        tv.append_column(col)
        sel = tv.get_selection()
        sel.set_mode(Gtk.SelectionMode.MULTIPLE)

        self.add(tv)
        self.show_all()

if __name__ == "__main__":
    app = TestWindow()
    Gtk.main()

質問で誤ったツリー選択モードを使用していることに注意してください。正しいモードはGtk.SelectionMode.MULTIPLE

2
Timo