设为首页 加入收藏

TOP

【GTK】布局容器(一)
2023-08-26 21:09:53 】 浏览:347
Tags:GTK 容器

GTK提供了许多不同的容器组件,用户可以通过搭配不同的容器组件来控制子组件的布局方式。
容器组件如下:

  • GtkBox
  • GtkGrid
  • GtkRevealer
  • GtkStack
  • GtkOverlay
  • GtkPaned
  • GtkExpander
  • GtkFixed

1、GtkBox

GtkBox会将子组件以水平或垂直的方式布局。
image
在创建GtkBox容器传入的GtkOrientation参数将决定GtkBox是以水平还是垂直的方式组织子组件。
所有组件的大小都是一样的。
gtk_box_append:向GtkBox中添加子组件;
gtk_box_remove:从GtkBox中移除子组件;
gtk_box_insert_child_after:在特定位置添加子组件;
gtk_box_set_homogeneous:是否对GtkBox中的子组件强制分配相同的空间;
gtk_box_set_spacing:设置子组件之间的间隔距离;
gtk_box_reorder_child_after:移动子组件位置;

2、GtkGrid

GtkGrid容器将子组件以网格的方式进行组织。
image
在这个容器中可以随意指定子组件的具体位置和子组件占据的行数与列数。
gtk_grid_attach:向容器中添加子组件;
gtk_grid_attach_next_to:在已存在的子组件后一个位置放置组件;
gtk_grid_remove:从grid中移除子组件;

3、GtkRevealer

该容器用于将他的子组件由不可见转为可见。
如果想要自定义过渡动画,可以通过gtk_revealer_set_transition_type函数进行设置。
gtk_revealer_new:创建GtkRevealer对象。
该容器只能有一个子组件。
示例如下:

点击查看代码
#include <gtk/gtk.h>
#include "common_macro.h"

#define LABEL1 "button1"
#define WIN_TITLE "GtkRevealer Test"

LOCAL void clicked(GtkButton *btn, gpointer user_data)
{
    g_print("hide");
    gtk_revealer_set_reveal_child((GtkRevealer *)user_data, FALSE);
}

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *win = gtk_application_window_new(app);
    GtkWidget *revealer = gtk_revealer_new();
    GtkWidget *btn = gtk_button_new_with_label(LABEL1);
    gtk_revealer_set_child((GtkRevealer *)revealer, btn);
    gtk_revealer_set_reveal_child((GtkRevealer *)revealer, TRUE);
    g_signal_connect(btn, SIGNAL_CLICKED, G_CALLBACK(clicked), revealer);

    gtk_window_set_title(GTK_WINDOW(win), WIN_TITLE);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
    gtk_window_set_child(GTK_WINDOW(win), revealer);
    gtk_window_present(GTK_WINDOW(win));
}

int main(int argc, char **argv)
{
    GtkApplication *app = NULL;
    int status = 0;
    app = gtk_application_new(APP_ID, G_APPLICATION_DEFAULT_FLAGS);
    g_signal_connect(app, SIGNAL_ACTIVATE, G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);
    return status;
}

4、GtkStack

GtkStack和数据机构中的堆栈类似,同一时间只会显示顶层组件。
与GtkNotebook相比,GtkStack没有为用户提供更改可见子节点的方法。相反,GtkStackSwitcher或GtkStackSidebar等单独的小部件可以与GtkStack一起使用来提供此功能。
页面之间的切换动画可以通过gtk_stack_set_transition_type方法进行控制。
GtkStack为每个添加的子节点维护一个GtkStackPage对象,该对象保存每个子节点的额外属性。您可以使用gtk_stack_get_page()获得子节点的GtkStackPage,并且可以使用gtk_stack_get_pages()获得包含所有页面的GtkSelectionModel对象。
示例如下:

点击查看代码
#include <gtk/gtk.h>
#include "common_macro.h"

#define WIN_TITLE "GtkStack Test"

gboolean switch_btn = FALSE;

LOCAL void clicked(GtkButton *btn, gpointer user_data)
{
    g_print(gtk_button_get_label(btn));
    GtkSelectionModel *model = gtk_stack_get_pages(GTK_STACK(user_data));
    if (switch_btn) {
        gtk_selection_model_select_item(model, 0, TRUE);
        switch_btn = FALSE;
    } else {
        switch_btn = TRUE;
        gtk_selection_model_select_item(model, 1, TRUE);
    }
}

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(win), WIN_TITLE);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);

    GtkWidget *stack = gtk_stack_new();
    GtkWidget *btn1 = gtk_button_new_with_label("button1&q
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言数据的存储 下一篇谁偷走了我的存储容量?预留空间O..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目