Я пытаюсь достичь вертикальной ориентации двух (2) GtkCellRenderers в GtkTreeViewColumn, используя glade или функцию gtk, не создавая пользовательский интерфейс программно. ячейки в GtkTreeViewColumn по умолчанию ориентированы горизонтально, как показано в документации . Однако я не могу установить вертикальную ориентацию как на поляне, так и программно (с помощью функции gtk), но создавая свой пользовательский интерфейс программно, я могу добиться этого.
Есть ли способ добиться вертикальной ориентации без необходимости создавать пользовательский интерфейс программно? Спасибо.
исходный код. c
#include <gtk/gtk.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkBuilder *builder = gtk_builder_new_from_file("test.glade");
GtkListStore *p_list = GTK_LIST_STORE(gtk_builder_get_object(builder, "p_list"));
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
GtkTreeView *pTreeView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "p_tree_view"));
GtkTreeSelection *pTreeSelection = GTK_TREE_SELECTION(gtk_builder_get_object(builder, "p_tree_selection"));
GtkTreeViewColumn *pPicture = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "p_picture"));
GtkCellRenderer *picture = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "picture"));
GtkTreeViewColumn *pName = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "p_name"));
GtkCellRenderer *name = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "name"));
GtkCellRenderer *lastMessage = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "last_message"));
GtkTreeViewColumn *p_id = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "p_id"));
GtkCellRenderer *id = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "id"));
/* Uncomment this block to view vertical orientation */
/* Programmatically setting up the vertical orientation*/
/*{
gtk_tree_view_remove_column(pTreeView, pName);
GtkCellArea *cell_area = gtk_cell_area_box_new();
gtk_orientable_set_orientation(GTK_ORIENTABLE(cell_area), GTK_ORIENTATION_VERTICAL);
GtkTreeViewColumn *column_1 = gtk_tree_view_column_new_with_area(cell_area);
gtk_tree_view_column_set_title(column_1, "Details");
gtk_tree_view_column_pack_start(column_1, name, FALSE);
gtk_tree_view_column_add_attribute(column_1, name, "text", 1);
gtk_tree_view_column_pack_start(column_1, lastMessage, FALSE);
gtk_tree_view_column_add_attribute(column_1, lastMessage, "text", 2);
gtk_tree_view_insert_column(pTreeView, column_1, 1);
gtk_tree_view_column_add_attribute(p_id, id, "text", 3);
gtk_cell_renderer_set_alignment(id, 0.0, 0.0);
}*/
GError *imageError = NULL;
/* Use any image here */
GdkPixbuf* image = gdk_pixbuf_new_from_file_at_size("test_profile_image.png", 50, 50, &imageError);
if (imageError)
{
g_warning("Could not load icon: %s\n", imageError->message);
g_error_free(imageError);
imageError = NULL;
}
GtkTreeIter iter;
for (size_t i = 0; i < 10; i++)
{
gtk_list_store_append(p_list, &iter);
gtk_list_store_set(p_list, &iter, 0, image, 1, "Firstname lastname", 2, "This is the very last message", 3, "1234567890", -1);
}
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show(window);
gtk_main();
return EXIT_SUCCESS;
}
test.glade
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.36.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkListStore" id="p_list">
<columns>
<!-- column-name picture -->
<column type="GdkPixbuf"/>
<!-- column-name p_name -->
<column type="gchararray"/>
<!-- column-name last_message -->
<column type="gchararray"/>
<!-- column-name p_id -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkWindow" id="window">
<property name="name">window</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScrolledWindow" id="p_scroll_window">
<property name="name">patient_scroll_window</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">False</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<property name="propagate_natural_width">True</property>
<property name="propagate_natural_height">True</property>
<child>
<object class="GtkTreeView" id="p_tree_view">
<property name="name">p_tree_view</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">p_list</property>
<property name="search_column">1</property>
<property name="activate_on_single_click">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="p_tree_selection">
<property name="mode">browse</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="p_picture">
<property name="title" translatable="yes">Picture</property>
<child>
<object class="GtkCellRendererPixbuf" id="picture"/>
<attributes>
<attribute name="pixbuf">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="p_name">
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="name"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
<child>
<object class="GtkCellRendererText" id="last_message"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="p_id">
<property name="title" translatable="yes">ID</property>
<child>
<object class="GtkCellRendererText" id="id"/>
<attributes>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
test_profile_image .png
test_profile_image
компилировать
gcc source.c -o source `pkg-config --cflags --libs gtk+-3.0`