gtk-listbox -contents显示在水平线的中间,列表框不适合窗口大小

时间:2017-11-19 12:34:18

标签: linux listbox gtk

我在gtk中为listbox编写了一个代码 问题 1.列表框的内容显示在水平线的中间。我希望它保持对齐。 2.列表框不符合窗口大小 3.列表框位于笔记本选项卡中。我想在选择列表框中的项目时进行一些处理(某个函数调用),隐藏当前选项卡显示,并显示带有结果和后退按钮的新选项卡。按下后退按钮时,2个选项卡会出现2种情况 在1个标签中 - 它只显示以前的内容 在标签2-中,它会再次处理并以原始格式在列表框中显示结果。

我的代码如下

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>

static void destroy(GtkWidget *widget, gpointer data)
{
  gtk_main_quit();
}


int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);

  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
  g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);

  GtkWidget *notebook = gtk_notebook_new();
  gtk_container_add(GTK_CONTAINER(window), notebook);


  int count;
  int i;
  gchar *text;

  for (count = 1; count <= 5; count++)
    {
      GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
      text = g_strdup_printf("Page %d", count);
      GtkWidget *label = gtk_label_new(text);
      GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
      gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow);
      //GtkWidget *textview = gtk_text_view_new();
      GtkWidget *listbox = gtk_list_box_new();
      for (i=1; i<100; i++)
      {
          gchar *name = g_strdup_printf("Label %i", i);
          GtkWidget *label = gtk_label_new(name);
          gtk_container_add(GTK_CONTAINER(listbox), label);

 }
      gtk_container_add(GTK_CONTAINER(scrolledwindow), listbox);
      gtk_container_add(GTK_CONTAINER(vbox), scrolledwindow);

      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
    }

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

1 个答案:

答案 0 :(得分:2)

回答1和2关于对齐和扩展属性的全部内容。

  1. 您可以在使用gtk_box_pack_*一组功能添加到容器时设置展开属性,例如gtk_box_pack_start
  2. 您可以使用gtk_widget_set_haligngtk_widget_set_valign函数
  3. 设置对齐方式

    将这些应用于您的代码:

    #include <gtk/gtk.h>
    #include <glib.h>
    #include <stdlib.h>
    
    static void destroy(GtkWidget *widget, gpointer data)
    {
      gtk_main_quit();
    }
    
    
    int main(int argc, char *argv[])
    {
      gtk_init(&argc, &argv);
    
      GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
      g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
    
      GtkWidget *notebook = gtk_notebook_new();
      gtk_container_add(GTK_CONTAINER(window), notebook);
    
    
      int count;
      int i;
      gchar *text;
    
      for (count = 1; count <= 5; count++)
      {
          GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
          text = g_strdup_printf("Page %d", count);
          GtkWidget *label = gtk_label_new(text);
          GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
          gtk_box_pack_start (GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
          GtkWidget *listbox = gtk_list_box_new();
          for (i=1; i<100; i++)
          {
              gchar *name = g_strdup_printf("Label %i", i);
              GtkWidget *label = gtk_label_new(name);
              gtk_widget_set_halign (GTK_WIDGET(label), GTK_ALIGN_START);
              gtk_container_add(GTK_CONTAINER(listbox), label);
    
          }
          gtk_container_add(GTK_CONTAINER(scrolledwindow), listbox);
          gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
      }
    
      gtk_widget_show_all(window);
    
      gtk_main();
    
      return 0;
    }
    

    注意gtk_box_pack_start将滚动窗口添加到容器时,将其设置为填充和展开。 另请检查GTK_ALIGN_START设置的标签halign

    结果应为:

    enter image description here

    关于3)它太具体了,无法真正理解你的目标。 您还应该分开问题,以便答案特定于每个问题。