国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【GTK】布局容器

這篇具有很好參考價(jià)值的文章主要介紹了【GTK】布局容器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

GTK提供了許多不同的容器組件,用戶可以通過搭配不同的容器組件來控制子組件的布局方式。
容器組件如下:

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

1、GtkBox

GtkBox會(huì)將子組件以水平或垂直的方式布局。
【GTK】布局容器
在創(chuàng)建GtkBox容器傳入的GtkOrientation參數(shù)將決定GtkBox是以水平還是垂直的方式組織子組件。
所有組件的大小都是一樣的。
gtk_box_append:向GtkBox中添加子組件;
gtk_box_remove:從GtkBox中移除子組件;
gtk_box_insert_child_after:在特定位置添加子組件;
gtk_box_set_homogeneous:是否對(duì)GtkBox中的子組件強(qiáng)制分配相同的空間;
gtk_box_set_spacing:設(shè)置子組件之間的間隔距離;
gtk_box_reorder_child_after:移動(dòng)子組件位置;

2、GtkGrid

GtkGrid容器將子組件以網(wǎng)格的方式進(jìn)行組織。
【GTK】布局容器
在這個(gè)容器中可以隨意指定子組件的具體位置和子組件占據(jù)的行數(shù)與列數(shù)。
gtk_grid_attach:向容器中添加子組件;
gtk_grid_attach_next_to:在已存在的子組件后一個(gè)位置放置組件;
gtk_grid_remove:從grid中移除子組件;

3、GtkRevealer

該容器用于將他的子組件由不可見轉(zhuǎn)為可見。
如果想要自定義過渡動(dòng)畫,可以通過gtk_revealer_set_transition_type函數(shù)進(jìn)行設(shè)置。
gtk_revealer_new:創(chuàng)建GtkRevealer對(duì)象。
該容器只能有一個(gè)子組件。
示例如下:

點(diǎn)擊查看代碼
#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和數(shù)據(jù)機(jī)構(gòu)中的堆棧類似,同一時(shí)間只會(huì)顯示頂層組件。
與GtkNotebook相比,GtkStack沒有為用戶提供更改可見子節(jié)點(diǎn)的方法。相反,GtkStackSwitcher或GtkStackSidebar等單獨(dú)的小部件可以與GtkStack一起使用來提供此功能。
頁面之間的切換動(dòng)畫可以通過gtk_stack_set_transition_type方法進(jìn)行控制。
GtkStack為每個(gè)添加的子節(jié)點(diǎn)維護(hù)一個(gè)GtkStackPage對(duì)象,該對(duì)象保存每個(gè)子節(jié)點(diǎn)的額外屬性。您可以使用gtk_stack_get_page()獲得子節(jié)點(diǎn)的GtkStackPage,并且可以使用gtk_stack_get_pages()獲得包含所有頁面的GtkSelectionModel對(duì)象。
示例如下:

點(diǎn)擊查看代碼
#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");
    GtkWidget *btn2 = gtk_button_new_with_label("button2");
    GtkWidget *btn3 = gtk_button_new_with_label("button3");

    gtk_window_set_child(GTK_WINDOW(win), stack);
    gtk_stack_add_child(GTK_STACK(stack), btn1);
    gtk_stack_add_child(GTK_STACK(stack), btn2);

    g_signal_connect(btn1, SIGNAL_CLICKED, G_CALLBACK(clicked), stack);
    g_signal_connect(btn2, SIGNAL_CLICKED, G_CALLBACK(clicked), stack);

    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;
}

5、GtkOverlay

GtkOverlay只能放置一個(gè)子組件,這個(gè)子組件的上面可以放置覆蓋組件。
【GTK】布局容器
overlay組件的具體位置由GtkWidget:halignGtkWidget:valign屬性指定。例如,當(dāng)組件的垂直和水平對(duì)齊都被設(shè)置為GTK_ALIGN_START,那么這個(gè)組件就會(huì)被放置在GtkOverlay容器的左上角。
這個(gè)容器主要用于將一個(gè)組件放置在另一個(gè)組件之上。

點(diǎn)擊查看代碼
#include<gtk/gtk.h>
#include"common_macro.h"

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *overlay = gtk_overlay_new();
    
    GtkWidget *btn1 = gtk_button_new_with_label("button1");
    gtk_overlay_set_child(GTK_OVERLAY(overlay), btn1);

    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
    gtk_window_set_title(GTK_WINDOW(win), "GtkOverlay Test");
    gtk_window_set_child(GTK_WINDOW(win), overlay);

    GtkWidget *btn2 = gtk_button_new_with_label("button2");
    gtk_widget_set_halign(btn2, GTK_ALIGN_START);
    gtk_overlay_add_overlay(GTK_OVERLAY(overlay), btn2);
    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;
}

6、GtkPaned

GtkPaned組件擁有兩個(gè)窗格,水平或者垂直。
【GTK】布局容器
用戶可以通過拉動(dòng)窗格分界線,調(diào)整兩個(gè)窗格的比例。
通過gtk_paned_set_start_child和gtk_paned_set_end_child方法在兩個(gè)窗格中添加子組件。這兩個(gè)窗格之間的比例是子組件大小默認(rèn)設(shè)置的,但是用戶可以進(jìn)行調(diào)整。
通常都是講子組件放到GtkFrame中,然后再講GtkFrame放到窗格中。如果只設(shè)置了一個(gè)窗格,那么將不會(huì)繪制分隔符。
每個(gè)子組件都有兩個(gè)可以設(shè)置的選項(xiàng),“resize”和“shrink”。如果設(shè)置為resize,那么當(dāng)GtkPaned尺寸變化時(shí),那么子組件的大小也會(huì)跟著變化。如果設(shè)置為“shrink”,那么子組件的大小會(huì)變得更小。
可以通過調(diào)用gtk_paned_set_position函數(shù)設(shè)置滑動(dòng)條的位置。

點(diǎn)擊查看代碼
#include<gtk/gtk.h>
#include"common_macro.h"

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
    
    GtkWidget *btn1 = gtk_button_new_with_label("button1");

    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
    gtk_window_set_title(GTK_WINDOW(win), "GtkPaned Test");
    gtk_window_set_child(GTK_WINDOW(win), paned);

    GtkWidget *btn2 = gtk_button_new_with_label("button2");
    gtk_paned_set_start_child(GTK_PANED(paned), btn1);
    gtk_paned_set_end_child(GTK_PANED(paned), btn2);
    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;
}

7、GtkExpander

GtkExpander可以讓用戶點(diǎn)擊擴(kuò)展三角形顯示子元素。
【GTK】布局容器
如果想要在點(diǎn)擊展開的時(shí)候進(jìn)行自定義行為,可以使用notify::expanded信號(hào)。

點(diǎn)擊查看代碼
#include<gtk/gtk.h>
#include"common_macro.h"

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *expander = gtk_expander_new("Test");
    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
    gtk_window_set_title(GTK_WINDOW(win), "GtkExpander Test");
    gtk_window_set_child(GTK_WINDOW(win), expander);
    GtkWidget *btn1 = gtk_button_new_with_label("btn1");
    gtk_expander_set_child(GTK_EXPANDER(expander), btn1);
    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;
}

8、GtkFixed

GtkFixed容器的子元素位置和尺寸大小都是固定的。
該容器不會(huì)自動(dòng)適應(yīng)容器變化。
不推薦使用該容器,因?yàn)樗赡軙?huì)導(dǎo)致文本截?cái)?、組件覆蓋以及其他的顯示問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-663464.html

點(diǎn)擊查看代碼
#include<gtk/gtk.h>
#include"common_macro.h"

LOCAL void activate(GtkApplication *app, gpointer user_data)
{
    GtkWidget *fixed = gtk_fixed_new();
    GtkWidget *win = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(win), 200, 200);
    gtk_window_set_title(GTK_WINDOW(win), "GtkFixed Test");
    gtk_window_set_child(GTK_WINDOW(win), fixed);
    GtkWidget *btn1 = gtk_button_new_with_label("btn1");
    gtk_fixed_put(GTK_FIXED(fixed), btn1, 10, 10);
    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;
}

到了這里,關(guān)于【GTK】布局容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包