2015-06-20 2 views
1

Я новичок в GTK. Последнее приложение GUI, которое я написал, использовало графический интерфейс текстового режима в Turbo C, поэтому я немного догоняю.Как получить выбор из gtk3 combobox с древовидной моделью

Я использую GTK для написания тестового жгута для некоторого кода, который в конечном итоге будет во встроенной системе. Я использую combobox с древовидной моделью, чтобы обеспечить двухуровневый выбор. Я получил combobox для отображения, как я хотел, хотя у меня нет хорошего недоразвития частей cell_renderer, которые я только что скопировал и вставил из другого вопроса переполнения стека.

GtkTreeStore* model = gtk_tree_store_new(1,G_TYPE_STRING) 
(Initilise model to hold desired strings using 
    gtk_tree_store_append and gtk_tree_store_set) 

GtkWidget* combobox = gtk_combo_box_new_with_model(model); 
gtk_combo_box_set_entry_text_column(combobox, 0); 

GtkCellRenderer *column = gtk_cell_renderer_text_new(); 
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox),column,TRUE); 
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combobox), column,"text", 0,NULL); 

Этот код работал, чтобы отображать выпадающие списки. Теперь мне нужно было выбрать выделение из выпадающего списка. Я попытался получить индекс из combobox, используя gtk_combo_box_get_active(). Возвращенный индекс мне не помог. Для элементов поддерева Он только показывал положение относительно родителя. Итак, я попытался вытащить текст выбранного варианта. Немного больше поиска нашел мне эту линию, чтобы вытащить текст из выпадающего списка:

gchar * selection = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(MyCombobox)))); 

однако, называя это дало мне следующую ошибку, и возвращается (нуль).

(test.exe:3040): GLib-GObject-WARNING **: invalid cast from `GtkCellView' to `GtkEntry' 
(test.exe:3040): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry)' failed 

Итак, немного больше прибегая к помощи указала, что мне нужно, чтобы инициализировать выпадающий с «входом», так обновили свою инициализацию выпадающего списка, чтобы:

combobox = gtk_combo_box_new_with_model_and_entry(model); 

И частичный успех !!. Теперь я могу вытащить текст из combobox, , но он отображает текст выделения дважды, в раскрывающемся списке выпадающих списков. Как только выбор сделан, он отображает сингл в самом окне. поэтому, если моя модель текст:

opt10 
    opt11 
opt20 
    opt21 

Дерево отображает каждый пункт дважды (выбирая первый opt11)

[opt10 opt10] > opt10 opt10 
       [opt11 opt11] 
opt20 opt20 > 

После того, как я делаю свой выбор, (скажем opt11) выпадающий список отображает выбранный текст правильно , и мой вызов gtk_entry_get_text (.....) возвращает текст «opt11», как я ожидаю.

Итак, я в тупике. Я хочу запросить combobox, чтобы получить либо индекс, который однозначно идентифицирует элемент в дереве, либо текстовую строку. У меня есть метод текстовой строки, но он отображает параметры combobox дважды.

Помощь?

Спасибо,

ответ

1

Это должно работать ... Компиляция этого кода с помощью команды в комментариях. Это «полный» вариант, используя модель и такое ... Если вы просто хотите, чтобы выбрать имя из списка, вы можете использовать GtkComboBoxText, который проще в использовании ...

/* 
* main.c 
* Copyright (C) 2015 John Coppens <[email protected]> 
* 
* standalone_filechooser is free software: you can redistribute it and/or modify it 
* under the terms of the GNU General Public License as published by the 
* Free Software Foundation, either version 3 of the License, or 
* (at your option) any later version. 
* 
* standalone_filechooser is distributed in the hope that it will be useful, but 
* WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
* See the GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License along 
* with this program. If not, see <http://www.gnu.org/licenses/>. 
* 
* gcc -o main `pkg-config --libs --cflags gtk+-3.0` main.c 
*/ 

#include <stdio.h> 
#include <gtk/gtk.h> 

int 
on_destroy(GtkWidget *win, gpointer data) 
{ 
    gtk_main_quit(); 
    return FALSE; 
} 

void 
sel_changed(GtkComboBox *cbbox, gpointer data) 
{ 
    GtkListStore *store; 
    GtkTreeIter iter; 
    int item_nr, ok; 
    char *item; 

    ok = gtk_combo_box_get_active_iter(cbbox, &iter); 
    printf("%i\n", ok); 
    store = GTK_LIST_STORE(gtk_combo_box_get_model(cbbox)); 
    gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 
    0, &item_nr, 
    1, &item, 
    -1); 

    printf("Item: %s, nr: %d\n", item, item_nr); 
    g_free(item); 
} 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *win, *cbbox; 
    GtkCellRenderer *col; 
    GtkListStore *store; 
    GtkTreeIter iter; 
    int i; 
    char *items[] = {"Thingie 1", "Thingie 2", "Thingie 3"}; 

    gtk_init(&argc, &argv); 

    win = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(on_destroy), NULL); 

    store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING); 
    for (i = 0; i < sizeof(items)/sizeof(char *); i++) { 
    gtk_list_store_append(store, &iter); 
    gtk_list_store_set(store, &iter, 
     0, i, 
     1, items[i], 
     -1); 
    } 

    cbbox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); 
    g_object_unref(store); 
    col = gtk_cell_renderer_text_new(); 
    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbbox), col, TRUE); 
    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(cbbox), col, 
     "text", 1, 
     NULL); 

    gtk_combo_box_set_id_column(GTK_COMBO_BOX(cbbox), 1); 
    g_signal_connect(G_OBJECT(cbbox), "changed", G_CALLBACK(sel_changed), NULL); 


    gtk_container_add(GTK_CONTAINER(win), cbbox); 

    gtk_widget_show_all(win); 

    gtk_main(); 

    return 0; 
} 
+0

Спасибо. Так оно и было. Трюк был двухступенчатым; 1) Получить выбранный элемент в combobox с помощью итератора; 2) Потяните модель из выпадающего списка (или, я думаю, вы могли бы использовать оригаль-моэдэль, если она все еще висит вокруг); 3) Используйте итератор, чтобы индексировать исходную древовидную структуру, которую combobox использует в качестве модели для получения выбранного значения –

Смежные вопросы