Gtk.SelectionMode.MULTIPLE 允许在 Gtk.TreeView 中仅选择一行

Gtk.SelectionMode.MULTIPLE 允许在 Gtk.TreeView 中仅选择一行

我正在使用 Quickly 开发一个应用程序。我有一个 Gtk.TreeView,其模型为 Gtk.ListStore。Gtk.SelectionMode 的选择模式设置为 Gtk.SelectionMode.MULTIPLE。

问题是 Gtk.SelectionMode 的行为不符合其应有的行为:

  • 一次只能选择一行。
  • 无法使用 Ctrl 或 Shift 键选择多行。
  • 一旦选择了一行,就无法使用 Ctrl 键取消选择。
  • 当我按下箭头键时什么也没有发生。

通过使用 Quickly 创建新的 Ubuntu 应用程序可以轻松重现该问题(或者您可以在下面下载一个测试应用程序)。

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

创建一个以 ListStore 为模型的 TreeView。将 GtkTreeSelection 的模式设置为“Multiple”。向 ListStore 添加一些列和值。向 Treeview 添加一些带有 CellRendererTexts 的 TreeViewColumns。

$ quickly run -v

请注意,您不能选择多行。

有些事情我已经尝试过,但没有改变任何东西:

  • 在代码中设置选择模式。

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

    或者

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

  • 将 GtkTreeSelection 移动到UI 文件中的<child>GtkTreeViewColumn 下方。<child>

  • 从 UI 文件中删除 GtkTreeSelection 并使用以下方式设置选择

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

我是否忽略了一些显而易见的事情?或者这可能是一个错误?

附带说明一下,如果将选择设置为“单个”,那么也无法取消选择该行。

编辑

如果您愿意帮助我,您可以在此处下载测试应用程序,而不必自己使用 Quickly 创建新项目。请注意,您需要 Quickly 才能运行它。

$ cd test
$ quickly run

我在 test/test/TestWindow.py 中实现了一些用于测试目的的回调。您可以在 test/data/ui/TestWindow.ui 中找到 UI 定义。

答案1

我无法给出完整的答案,但想分享一下。如果问的是编程问题,请始终包含一个最小的工作示例,以便其他人可以快速(哈哈,双关语)运行和测试您的代码。我必须安装 Quickly,创建一个 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

我找到了解决我自己的问题的方法。

'can-focus'Gtk.TreeView 的属性False默认设置为。将其设置为可修复奇怪的选择行为,以及可能发生的其他奇怪行为,例如,当其属性设置True为时无法调整列的大小。'resizable'True

相关内容