我正在使用 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