0

以下は、C コードでGTK+gtktreeviewに組み込まれたものです。最初の行はgtk_cell_renderer_text_newによって作成されたヘッダーです。次の行は内容です。GtkListStore

行がたくさんあると仮定して、下にスクロールすると、ヘッダーのすぐ下iterの行を見つけるにはどうすればよいですか? たとえば、最初はヘッダーのすぐ下の行の iter は 0 です。下にスクロールすると、ヘッダーのすぐ下の行の iter は 3 または 78 などになります。ヘッダーのすぐ下の行が選択されていない可能性があることに注意してください。

知らない:

まず、「下にスクロール」というアクションに関連する信号は何ですか?

次に、ヘッダーのすぐ下の行を見つける方法は?

助けてください。ありがとうございました。

+----------+-----------+------------+----------------------+
|row ID    |title 2    |title 3     |title 4               |
|          |           |            |                      |
+----------+-----------+------------+----------------------+
|          |           |            |                      |
|    1     |           |            |                      |
+----------+-----------+------------+----------------------+
|          |           |            |                      |
|    2     |           |            |                      |
+----------+-----------+------------+----------------------+
|          |           |            |                      |
|    3     |           |            |                      |
+----------+-----------+------------+----------------------+
4

2 に答える 2

1

GtkTreeview はGtkScrollableを実装しているため、調整を行ってシグナルにgtk_scrollable_get_vadjustment ()接続できます。value-changed

質問 2 については、次を参照しgtk_tree_view_get_visible_range ()てください。start_path は、わずかに見える最初の行のパスである必要があります。

于 2013-10-16T17:50:18.820 に答える
1

jkuの回答によると、問題の詳細な解決策は次のとおりです。

void treeview_vadjustment_changed (GtkWidget *widget, gpointer data)
{
  GtkTreePath *start_path;

  if(gtk_tree_view_get_visible_range(treeview, &start_path, NULL))
  {
    gchar *str;
    GtkTreeIter start_iter, iter;
    GtkTreeModel *model = gtk_tree_view_get_model(treeview);
    if(gtk_tree_model_get_iter(model, &start_iter, start_path) && ACC_truss_get_truss_weight_iter (model, start_iter, &iter))
    {
      int who;
      GtkWidget *window = g_object_get_data(G_OBJECT(treeview), "parent_window");

      gtk_tree_model_get(model, &iter, TRUSS_MEM_AXIS_NAME, &str, -1);
      who = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(model), "which_truss"));
      switch(who)
      {
    case 0:
      gtk_entry_set_text((GtkEntry *)g_object_get_data(G_OBJECT(window), "ACC_SDD_main_truss_curr"), str);  
      break;
    case 1:
      gtk_entry_set_text((GtkEntry *)g_object_get_data(G_OBJECT(window), "ACC_SDD_second_truss_curr"), str);  
      break;
      }
      g_free(str);
    }
  }
  gtk_tree_path_free(start_path);
}

  .
  .
  store = gtk_list_store_new(TRUSS_NUMS_MEM_SEC, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
  switch(who)
  {
    case 0:
      g_object_set_data(G_OBJECT(window), "ACC_main_truss_SDD_mem_tree_store", store);
      break;
    case 1:
      g_object_set_data(G_OBJECT(window), "ACC_second_truss_SDD_mem_tree_store", store);
      break;
  }

  model = GTK_TREE_MODEL(store);

  /* create tree view */
  treeview = gtk_tree_view_new_with_model(model);
  g_object_set_data(G_OBJECT(treeview), "parent_window", window);
  gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
/*  gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview), COLUMN_DESCRIPTION);*/
  ACC_member_treeview_header_truss (GTK_TREE_VIEW(treeview), who);
  g_object_unref(model);
  gtk_widget_show(treeview);
  gtk_container_add(GTK_CONTAINER(scrolled_window), treeview);

  vadjustment = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(treeview));
  g_signal_connect(vadjustment, "value-changed", G_CALLBACK(treeview_vadjustment_changed), treeview);
  .
  .
于 2013-10-17T09:51:36.390 に答える