GtkCellRendererText 实现可选择单元格内容且不可编辑

GtkTreeView 构件中可以 Insert 类型为 GtkCellRendererText 的文本 Column,如果将 GtkCellRendererText 对象的属性 “editable” 设置为 True,则可以双击编辑单元格内容,在点击其它地方或按下回车后会认为编辑完成,触发 “edited” 信号,调用此信号处理函数,一般会在这个处理函数中调用 Model 的方法修改数据。

有些时候我们也会有这样的需求,如上面的情况,可以双击单元格内容进入编辑状态,但是不能修改编辑框的内容。仅仅给用户提供个可选择复制的条件。这应该如何实现呢?

GtkCellRendererText 类是从 GtkCellRenderer 类派生出来的子类,其父类 GtkCellRenderer 有一个信号 “editing-started” 指的是当开始编辑时,意思应该是刚进入编辑模式的时候。其处理函数定义如下:

void user_function(GtkCellRenderer * renderer, GtkCellEditable * editable, gchar * path, gpointer data);

从中发现有个参数 editable,类型为 GtkCellEditable,是个接口类。那它应该就是编辑构件啦!问题简单了,只需要在这个信号处理函数中将这个编辑构件设置为不可编辑模式就行啦! 示例代码:

static void cell_renderer_text_editing_started_handler(GtkCellRenderer * renderer,
                                        GtkCellEditable * editable,
                                        gchar * path, gpointer data)
{
    if(GTK_IS_EDITABLE(editable))
       gtk_editable_set_editable(GTK_EDITABLE(editable), FALSE);
}
 
int add_columns(GtkTreeView * tree_view)
{
    GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
    g_object_set(G_OBJECT(renderer), "editable", TRUE, -1);
    g_signal_connect(G_OBJECT(renderer), "editing-started",
        G_CALLBACK(cell_renderer_text_editing_started_handler), NULL);
    gtk_tree_view_insert_column_with_attributes(tree_view, -1, "Name",
        renderer, "text", COLUMN_NAME, NULL);
    ...
}

Over!

Leave a Reply

Your email address will not be published. Required fields are marked *