有没有一种方法可以设置GTKTreeViewColumn的“单元区域”属性?

时间:2020-07-12 14:07:38

标签: gtk glade

我试图使用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

test_profile_image

编译

gcc source.c -o source `pkg-config --cflags --libs gtk+-3.0`

1 个答案:

答案 0 :(得分:0)

如上面的注释代码所示,这是目前实现此目标的唯一方法。

TreeViewColumn的CellArea需要以编程方式设置为“垂直方向”。