问题描述
我有一个 TreeView,它的行是可重新排序的。当我拖放一行时,它会适当移动,但我没有收到任何与拖放过程相关的信号。
UI 内置在 Glade 中,我将所有拖放信号连接到代码中的函数,这些函数打印信号的名称,但它似乎不起作用。
我认为信号应该由 TreeView 的 CellRenderer 触发,而不是由树本身触发,但这些信号对 Glade 中的 CellRenderer 不可用。
我觉得有些事情我根本不理解。
这是我的代码:
main.glade:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkTreeStore" id="my_treestore">
<columns>
<!-- column-name name -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkWindow" id="main_window">
<property name="can_focus">False</property>
<property name="default_width">640</property>
<property name="default_height">480</property>
<signal name="destroy" handler="window_destroy" swapped="no"/>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="my_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">my_treestore</property>
<property name="headers_visible">False</property>
<property name="reorderable">True</property>
<property name="enable_search">False</property>
<property name="enable_tree_lines">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="name_column">
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="name_cell_renderer"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
main.py:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk
class Main:
def __init__(self):
builder = Gtk.Builder()
builder.add_from_file("main.glade")
builder.connect_signals(self)
window = builder.get_object("main_window")
window.show_all()
self.builder = builder
self.fill_tree(None,0)
def window_destroy(self,button):
Gtk.main_quit()
def fill_tree(self,iter,parent_id,level): # Recursively fill the treeview model with some data
model = self.builder.get_object('my_treestore')
for x in range(3):
id = 3*parent_id+x+1
row = ('Node {}'.format(id),)
new_iter = model.append(iter,row)
if level < 3:
self.fill_tree(new_iter,id,level+1)
def drag_begin_cb(self,widget,context,user_data):
print('drag data begin')
def drag_data_delete_cb(self,user_data):
print('drag data delete')
def drag_data_get_cb(self,selection_data,info,time,user_data):
print('drag data get')
def drag_data_received_cb(self,x,y,user_data):
print('drag data received')
def drag_drop_cb(self,user_data):
print('drag drop')
def drag_end_cb(self,user_data):
print('drag end')
def drag_Failed_cb(self,result,user_data):
print('drag Failed')
def drag_leave_cb(self,user_data):
print('drag leave')
def drag_motin_cb(self,user_data):
print('drag motion')
def main():
main = Main()
Gtk.main()
if __name__ == '__main__':
main()
解决方法
我建议您查看 Treeview 和 TreeStore 的信号,也许是信号 row-changed?