【问题标题】:Reorder rows in GtkTreeView after they have been sorted对 GtkTreeView 中的行进行排序后重新排序
【发布时间】:2018-02-13 20:38:26
【问题描述】:

我有以下 GTK+ 程序,它使用 Glade 生成的 XML 文件来构建它的 GUI。

#include <gtk/gtk.h>
#include <stdlib.h>
#include <string.h>

////////////////////////////////////////////////////
// Example can be compiled with:
// gcc gui.c `pkg-config --cflags --libs gtk+-2.0`
//
// GUI file from glade must be in same folder from
// which the compiled binary is called.
////////////////////////////////////////////////////
int main(int argc, char* argv[]) {
    GtkBuilder* gtkBuilder = gtk_builder_new();

    gtk_init(&argc, &argv);

    gtk_builder_add_from_file(gtkBuilder, "gui.glade", NULL);

    GtkTreeStore* treestore = GTK_TREE_STORE(gtk_builder_get_object(gtkBuilder, "treestore"));

    GtkTreeIter iterChild;

    gtk_tree_store_append(treestore, &iterChild, NULL);
    gtk_tree_store_set(treestore, &iterChild, 0, "a", -1);
    gtk_tree_store_append(treestore, &iterChild, NULL);
    gtk_tree_store_set(treestore, &iterChild, 0, "b", -1);
    gtk_tree_store_append(treestore, &iterChild, NULL);
    gtk_tree_store_set(treestore, &iterChild, 0, "m", -1);
    gtk_tree_store_append(treestore, &iterChild, NULL);
    gtk_tree_store_set(treestore, &iterChild, 0, "k", -1);
    gtk_tree_store_append(treestore, &iterChild, NULL);
    gtk_tree_store_set(treestore, &iterChild, 0, "g", -1);

    gtk_builder_connect_signals(gtkBuilder, NULL);

    gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "main")));

    g_object_unref(G_OBJECT(gtkBuilder));

    gtk_main();

    return 0;
}

XML Glade 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkTreeStore" id="treestore">
    <columns>
      <!-- column-name col -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkWindow" id="main">
    <property name="can_focus">False</property>
    <property name="default_width">690</property>
    <property name="default_height">500</property>
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
    <child>
      <object class="GtkTreeView" id="treeview">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="model">treestore</property>
        <property name="reorderable">True</property>
        <property name="level_indentation">1</property>
        <property name="enable_tree_lines">True</property>
        <child>
          <object class="GtkTreeViewColumn" id="treeviewcolumn">
            <property name="sizing">fixed</property>
            <property name="title" translatable="yes">column</property>
            <property name="clickable">True</property>
            <property name="sort_indicator">True</property>
            <property name="sort_column_id">0</property>
            <child>
              <object class="GtkCellRendererText" id="treeviewrenderer">
                <property name="height">30</property>
              </object>
              <attributes>
                <attribute name="text">0</attribute>
              </attributes>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>

当应用程序启动时,行可以通过拖放重新排序。单击列标题后,将对行进行排序。之后它们不能再通过 Drag 'n' Drop 重新排列。

有没有办法在行排序后重新激活手动重新排序?

我尝试过,例如,从回调函数中调用 gtk_tree_view_set_reorderable()(回调为 on_cursor_moved()),但这不起作用。

当使用 Glade XML 文件构建 GUI 时,是否可以在已排序和可重新排序的行之间切换?

【问题讨论】:

    标签: c gtk glade gtk2 gtktreeview


    【解决方案1】:

    您需要用树排序包装树模型,然后每三次单击禁用排序。

    林间空地文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Generated with glade 3.18.3 -->
    <interface>
      <requires lib="gtk+" version="3.0"/>
      <object class="GtkTreeStore" id="treestore">
        <columns>
          <!-- column-name col -->
          <column type="gchararray"/>
        </columns>
      </object>
      <object class="GtkTreeModelSort" id="treesort">
        <property name="model">treestore</property>
      </object>
      <object class="GtkWindow" id="main">
        <property name="can_focus">False</property>
        <property name="default_width">690</property>
        <property name="default_height">500</property>
        <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
        <child>
          <object class="GtkTreeView" id="treeview">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="model">treesort</property>
            <property name="reorderable">True</property>
            <property name="level_indentation">1</property>
            <property name="enable_tree_lines">True</property>
            <child internal-child="selection">
              <object class="GtkTreeSelection" id="treeview-selection1"/>
            </child>
            <child>
              <object class="GtkTreeViewColumn" id="treeviewcolumn">
                <property name="sizing">fixed</property>
                <property name="title" translatable="yes">column</property>
                <property name="clickable">True</property>
                <property name="sort_indicator">True</property>
                <property name="sort_column_id">0</property>
                <child>
                  <object class="GtkCellRendererText" id="treeviewrenderer">
                    <property name="height">30</property>
                  </object>
                  <attributes>
                    <attribute name="text">0</attribute>
                  </attributes>
                </child>
              </object>
            </child>
          </object>
        </child>
      </object>
    </interface>
    

    【讨论】:

    • 这会恢复之前的顺序,但我仍然无法通过拖放手动重新排序。
    • 您可以通过拖放重新排序吗?抱歉,由于某种原因,您的程序无法为我运行,而且我不擅长 C。
    • 好的,我开始了。但是你的程序是Gtk2,我只知道Gtk3。
    • 我可以使用我的版本重新排序,直到我单击列并对树视图进行排序。如果我将树模型包装在树排序中,那么我根本无法重新排序。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多