Toon posts:

[C++][GTK+-2.0] Item selecteren in boom

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben een map-builder aan het maken voor een klein strategy spel wat ik maak in C++.
Ik probeer dus een boom bouwen met GTK, hierin heb je dus hoofdcategorien (zoals gebouwen, terrein, dieren) waar een pijltje voor staat en zodra je er op klikt er een lijst te voorschijn komt waar je een item uit kan selecteren. Nu lees ik deze tutorial:

http://scentric.net/tutorial/

En ben ik in de war met GtkCellRenderer en GtkTreeViewColumn, met de volgende code lukt het me niet om een item te selecteren in de boom:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* 
 * Compile with:
 *  gcc -o helloworld helloworld.c `pkg-config --cflags --libs gtk+-2.0`
 *
 */

#include <gtk/gtk.h>

enum
{
  COL_NAME = 0,
  COL_AGE,
  NUM_COLS
} ;


static GtkTreeModel *
create_and_fill_model (void)
{
  GtkTreeStore  *treestore;
  GtkTreeIter    toplevel, child;

  treestore = gtk_tree_store_new(NUM_COLS,
                                 G_TYPE_STRING,
                                 G_TYPE_INT);

  /* Append a top level row and leave it empty */
  gtk_tree_store_append(treestore, &toplevel, NULL);
  gtk_tree_store_set(treestore, &toplevel,
                     COL_NAME, "Maria",
                     COL_AGE, 25,
                     -1);

  /* Append a second top level row, and fill it with some data */
  gtk_tree_store_append(treestore, &toplevel, NULL);
  gtk_tree_store_set(treestore, &toplevel,
                     COL_NAME, "Jane",
                     COL_AGE, 4, -1);

  /* Append a child to the second top level row, and fill in some data */
  gtk_tree_store_append(treestore, &child, &toplevel);
  gtk_tree_store_set(treestore, &child,
                     COL_NAME, "Janinita",
                     COL_AGE, 3, -1);

  
  return GTK_TREE_MODEL (treestore);
}

static GtkWidget *
create_view_and_model (void)
{
  GtkTreeViewColumn   *col;
  GtkCellRenderer     *renderer;
  GtkWidget           *view;
  GtkTreeModel        *model;

  view = gtk_tree_view_new();

  /* Setup the selection handler */
  GtkTreeSelection *select;

  /* --- Column #1 --- */

  col = gtk_tree_view_column_new();

  gtk_tree_view_column_set_title(col, "First Name");

  /* pack tree view column into tree view */
  gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

  renderer = gtk_cell_renderer_text_new();

  /* pack cell renderer into tree view column */
  gtk_tree_view_column_pack_start(col, renderer, TRUE);

  /* connect 'text' property of the cell renderer to
   *  model column that contains the first name */
  gtk_tree_view_column_add_attribute(col, renderer, "text", COL_NAME);


  /* --- Column #2 --- */

  col = gtk_tree_view_column_new();

  gtk_tree_view_column_set_title(col, "Last Name");

  /* pack tree view column into tree view */
  gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

  renderer = gtk_cell_renderer_text_new();

  /* pack cell renderer into tree view column */
  gtk_tree_view_column_pack_start(col, renderer, TRUE);

  /* connect 'text' property of the cell renderer to
   *  model column that contains the last name */
  gtk_tree_view_column_add_attribute(col, renderer, "text", COL_AGE);

  /* set 'weight' property of the cell renderer to
   *  bold print (we want all last names in bold) */
  g_object_set(renderer,
               "weight", PANGO_WEIGHT_BOLD,
               "weight-set", TRUE,
               NULL);


  model = create_and_fill_model();

  gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);

  g_object_unref(model); /* destroy model automatically with view */

  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
                              GTK_SELECTION_NONE);

  return view;
}


int
main (int argc, char **argv)
{
  GtkWidget *window;
  GtkWidget *view;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (window, "delete_event", gtk_main_quit, NULL); /* dirty */

  view = create_view_and_model ();

  gtk_container_add (GTK_CONTAINER (window), view);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}


Hoe komt dit? Waarom lukt dit niet? Wat moet ik doen waardoor ik wel een item in de lijst kan selecteren?

Ik zie wel in de tutorial staan hoe je moet controleren of een item geselecteerd is maar ik kan niet vinden hoe je er voor moet zorgen dat een item geselecteerd kan worden.

Alvast bedankt,

Peter.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

Mbv gtk_tree_view_get_selection krijg je een GtkTreeSelection* terug. Die heeft 2 methods waar je wellicht wat aan hebt: gtk_tree_selection_select_path en gtk_tree_selection_select_iter. Je moet dan wel een GtkTreePath of GtkTreeIter hebben, maar met de documentatie (GTK+ 2.0 Reference Manual en GTK+ 2.0 Tutorial) moet je een eind kunnen komen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Bedankt voor je antwoord, maar ik denk dat ik nog niet helemaal duidelijk genoeg ben geweest.

Ik wil dat de gebruiker een rij kan selecteren, ik weet wel hoe ik moet controleren of een rij geselecteerd is... maar als ik met mijn bovenstaande code op een rij druk met de muis... dan wordt de rij niet geselecteerd. Nu ben ik er achter gekomen dat wanneer ik create_view_and_model vervang voor de volgende functie:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
static GtkWidget *
create_view_and_model (void)
{
  GtkCellRenderer     *renderer;
  GtkTreeModel        *model;
  GtkWidget           *view;

  view = gtk_tree_view_new ();

  /* --- Column #1 --- */

  renderer = gtk_cell_renderer_text_new ();
  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
                                               -1,      
                                               "Name",  
                                               renderer,
                                               "text", COL_NAME,
                                               NULL);

  /* --- Column #2 --- */

  renderer = gtk_cell_renderer_text_new ();
  gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
                                               -1,      
                                               "Age",  
                                               renderer,
                                               "text", COL_AGE,
                                               NULL);

  model = create_and_fill_model ();

  gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);

  /* The tree view has acquired its own reference to the
   *  model, so we can drop ours. That way the model will
   *  be freed automatically when the tree view is destroyed */

  g_object_unref (model);
  return view;
}


Wel de rij geselecteerd kan worden door de gebruiker...
Hier wordt enkel een kolom gemaakt met GtkCellRenderer en niet met GtkViewColumns? Ik snap niet wat hier zo anders aan is dan mijn originele code. Zou iemand mij kunnen uitleggen wat het verschil is? En waarom het met deze functie wel lukt om de gebruiker een rij te laten selecteren?

Alvast bedankt,

Peter.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

Misschien zit het wel in de volgende regel:
C++:
1
2
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), 
                              GTK_SELECTION_NONE);

Zie ook GtkSelectionMode:
GTK_SELECTION_NONE No selection is possible.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Lijkt me inderdaad vrij duidelijk ja :)

Overigens: is er een reden waarom je gtm en niet gtkmm gebruikt, je bent nu namelijk met C bezig, en niet met C++.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Oeps :), niet gezien... beetje dom van me. Bedankt.

@Creepy: In de tutorial staan enkel C voorbeelden, dus heb die maar overgenomen.

Verwijderd

Topicstarter
Nog een klein vraagje, waarom wordt er zo moeilijk gedaan bij create_and_view_model? De verkorte versie die ik gaf ziet er hetzelfde uit (op de bold gedrukte tekst na dan). Wat zijn dan de verschillen?
Pagina: 1