Как я могу узнать, что g_list_store_append в каком GtkColumnView добавляет строку в gtk4?

Этот код показывает, как я создал представление столбца:

GListStore *store = g_list_store_new (GTK_TYPE_STRING_OBJECT);
GtkSelectionModel *selection = GTK_SELECTION_MODEL(gtk_single_selection_new (G_LIST_MODEL(store)));
GtkWidget *view = gtk_column_view_new (selection);
// begin col1:
GtkListItemFactory *factory = gtk_signal_list_item_factory_new ();
g_signal_connect (factory, "setup", G_CALLBACK (cb_setup_col1), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (cb_bind_col1), NULL);
GtkColumnViewColumn *column1 = gtk_column_view_column_new ("Archivo", factory);
gtk_column_view_append_column (GTK_COLUMN_VIEW (view), column1);
// end col1
// begin col2:
GtkColumnViewColumn *column2 = gtk_column_view_column_new ("Formato", factory);
gtk_column_view_append_column (GTK_COLUMN_VIEW (view), column2);
// end col2

g_autoptr(GtkStringObject) strobj1 = gtk_string_object_new ("str_for_col1");
g_autoptr(GtkStringObject) strobj2 = gtk_string_object_new ("str_for_col2");
g_list_store_append (store, strobj1);
g_list_store_append (store, strobj2);

//...
void cb_setup_col1 (GtkSignalListItemFactory *self, GtkListItem *list_item, gpointer user_data)
{
    GtkWidget *label = gtk_label_new ("");
    gtk_list_item_set_child (list_item, label);
}

void cb_bind_col1 (GtkSignalListItemFactory *self, GtkListItem *list_item, gpointer user_data)
{
    GtkStringObject *strobj = gtk_list_item_get_item (list_item);
    GtkWidget *label = gtk_list_item_get_child (list_item);
    gtk_label_set_text (GTK_LABEL(label), gtk_string_object_get_string (strobj));
}

Дело в том, что я понимаю, что у меня есть одна модель со строкой типа для обоих столбцов, а не gtk_list_store_set, которой я могу указать позицию для вставки строки. Есть идеи о том, как вставить strobj2 в качестве элемента для второго столбца?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать представление столбцов с несколькими столбцами, это уже должно быть учтено в ListStore.

Например вот так:

#define CAPITAL_TYPE_ITEM (capital_item_get_type())
G_DECLARE_FINAL_TYPE (CapitalItem, capital_item, CAPITAL, ITEM, GObject)

struct _CapitalItem
{
    GObject parent_instance;
    const char *name;
    const char *country;
    const char *founded;
    const char *population;
    const char *area;
};

struct _CapitalItemClass
{
    GObjectClass parent_class;
};

G_DEFINE_TYPE (CapitalItem, capital_item, G_TYPE_OBJECT)

static void capital_item_init(CapitalItem *item)
{
}

static void capital_item_class_init(CapitalItemClass *class)
{
}

static CapitalItem * capital_item_new(const char *name,
                const char *country,
                const char *founded,
                const char *population,
                const char *area )
{
    CapitalItem  *item = g_object_new(CAPITAL_TYPE_ITEM, NULL);
    item->name = g_strdup(name);
    item->country = g_strdup(country);
    item->founded = g_strdup(founded);
    item->population = g_strdup(population);
    item->area = g_strdup(area);
    return item;
}

// a funktion that creates a GListModel with capital_item  objects
GListModel * create_capital_model(void)
{
    GListStore *store = g_list_store_new(G_TYPE_OBJECT);
    g_list_store_append(store, capital_item_new("Washington,D.C.","USA","1790","712,816","177"));
    g_list_store_append(store, capital_item_new("London","Britain","43","8,799,800","1,572.03"));
    g_list_store_append(store, capital_item_new("Paris","France","3rd c. BC","2,161,000","105"));
    g_list_store_append(store, capital_item_new("Berlin","Germany","13th century","3,850,809","891.3"));
    g_list_store_append(store, capital_item_new("Rome","Italy","753 BC","2,860,009","1,285"));
    return G_LIST_MODEL(store);
}

Кроме того, для каждого столбца необходима фабрика.

Полный пример можно найти здесь:

https://stackoverflow.com/a/77759424/22768315

Здесь показано, как можно определить и изменить запись, выбранную с помощью мыши.

https://stackoverflow.com/a/77619798/22768315

Здесь показан один из вариантов сортировки:

https://stackoverflow.com/a/78185115/22768315

Получайте удовольствие, продолжая программировать

Хорошо. Я немного понимаю ваш код. Но как можно имитировать тот же эффект от gtk_list_store_get для захвата строки n позиции. Например, в вашем коде как получить Францию?

Joel 04.05.2024 01:20

Доступ всегда должен осуществляться через GListStore. Для этого существуют различные функции. g_list_store_insert_sorted; g_list_store_insert; g_list_store_find_with_equal_func

Holger 04.05.2024 11:19

Спасибо за вклад. Этот виджет — настоящий вызов. Я подожду кого-нибудь с альтернативным решением.

Joel 04.05.2024 16:26

Отмечен как принятый ответ, потому что этот метод кажется наиболее подходящим.

Joel 27.05.2024 15:30

Другие вопросы по теме