我试图使用Glade或gtk函数在GtkTreeViewColumn中实现两(2)个GtkCellRenderers的垂直方向,而无需以编程方式构建UI。
我已经使用Glade连接了UI,并且意识到documentation中默认情况下,GtkTreeViewColumn中的单元格是水平定向的。但是,我无法在林间空地和以编程方式(使用gtk函数)将方向设置为垂直,但通过编程方式构建UI却可以实现。
有没有一种方法可以实现垂直方向而无需以编程方式构建UI?谢谢。
source.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
编译
gcc source.c -o source `pkg-config --cflags --libs gtk+-3.0`
答案 0 :(得分:0)
如上面的注释代码所示,这是目前实现此目标的唯一方法。
TreeViewColumn的CellArea需要以编程方式设置为“垂直方向”。