我有一个Gtk.ListStore
模型填充了标题和作者信息,我希望用户能够移动元素以按照他们选择的任何顺序放置它们。这意味着提供“上移”和“下移”按钮。
不幸的是,我在 this question 中找到的逻辑不与 Gtk.TreeView
合作允许选择多个元素。
Gtk.TreeSelection.get_selected()
返回一个包含 Gtk.TreeIter
的元组指向当前选定的单个行,但是 Gtk.TreeSelection.get_selected_rows()
返回一个包含 Gtk.TreePath
列表的元组元素。
上面链接的单选行问题的答案仅适用于 Gtk.TreeIter
对象,我一直无法弄清楚如何转换 Gtk.TreePath
进入Gtk.TreeIter
对象。
但是,我确实找到了 Gtk.ListStore.move_above(iter, position)
和Gtk.ListStore.move_below(iter, position)
方法,但同样,它们需要 Gtk.TreeIter
工作对象。
我是否错过了对其他人来说完全显而易见的东西?
最佳答案
Gtk.ListStore.move_above(iter,position)
和 Gtk.ListStore.move_below(iter,position)
是正确的调用方法,但事实证明相对于我正在使用的 Python 3 版本和 Gtk3 接口(interface),我正在阅读的文档实际上是错误的。
(抱歉,我不知道如何确定我正在使用哪个版本的界面)
Gtk.TreeSelection.get_selected_rows()
实际上返回一个包含 Gtk.TreeModelRow
的元组和我正在使用的模型的表示。
Gtk.TreeModelRow
包含对给定行的相应 Gtk.TreePath
和 Gtk.TreeIter
对象的引用,如变量Gtk.TreeModelRow.path
和Gtk.TreeModelRow.iter
。
所以,我的最终代码用于向上移动多个选定的行:
selection = treeView.get_selection()
selections, model = selection.get_selected_rows()
for row in selections:
# Make sure the row we are given is actually selected
if selection.iter_is_selected(row.iter) and row.previous != None:
self.listData.move_before(row.iter, row.previous.iter)
以及我用于向下移动多个选定行的代码:
selection = treeView.get_selection()
selections, model = selection.get_selected_rows()
# Note: Must loop through rows in the opposite direction so as not to move a row all the way to the bottom
for i in range(len(selections)-1, -1, -1):
row = selections[i]
# Make sure the row we are given is actually selected
if selection.iter_is_selected(row.iter) and row.next != None:
self.listData.move_after(row.iter, row.next.iter)
关于listview - 如何上下移动多个ListStore元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228074/