• An Introduction to C & GUI Programming -----Simon Long 学习笔记 4


    Labels and layout  标签和布局

    Label---主要用于显示文字,用户不能修改文字

    demo

    #include <gtk/gtk.h>
    void end_program (GtkWidget *wid, gpointer ptr)
    {
        printf("bybye
    ");
        gtk_main_quit ();
    }
    
    int main (int argc, char *argv[])
    {
        gtk_init (&argc, &argv);
    
        GtkWidget *win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        GtkWidget *win2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW(win1), "QT");
        gtk_window_set_title (GTK_WINDOW(win2), "GTK");
        gtk_window_set_default_size(GTK_WINDOW(win1), 120, 240);
        gtk_window_set_default_size(GTK_WINDOW(win2), 240, 120);
    
        GtkWidget *btn1 = gtk_button_new_with_label ("Close window1");
        GtkWidget *btn2 = gtk_button_new_with_label ("Close window2");
    
        GtkWidget *labelA = gtk_label_new ("LABELA");
        GtkWidget *labelB = gtk_label_new ("LABELB");
        gtk_container_add (GTK_CONTAINER (win1), labelA);
        gtk_container_add (GTK_CONTAINER (win2), labelB);
    
        g_signal_connect (btn1, "clicked", G_CALLBACK (end_program), NULL);
        g_signal_connect (win2, "delete_event", G_CALLBACK (end_program), NULL);
    
        gtk_widget_show_all (win1);
        gtk_widget_show_all (win2);
        gtk_main ();
        return 0;
    }

    编译  gcc `pkg-config --cflags gtk+-3.0` test.c -o hello `pkg-config --libs gtk+-3.0`

    结果

    作者在这里也说明了为什么1个window只能有1个widget 

    a GtkWindow can only contain one widget at a time, and that this one already contains a GtkButton. 

    So you can only put one widget into a window, but we want to have two – a button and a label; that’s not going to work

    解决方法---BOX

    #include <gtk/gtk.h>
    void end_program (GtkWidget *wid, gpointer ptr) { printf("bybye "); gtk_main_quit (); } int main (int argc, char *argv[]) { gtk_init (&argc, &argv); GtkWidget *win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); GtkWidget *win2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW(win1), "QT"); gtk_window_set_title (GTK_WINDOW(win2), "GTK"); gtk_window_set_default_size(GTK_WINDOW(win1), 120, 240); gtk_window_set_default_size(GTK_WINDOW(win2), 240, 120); GtkWidget *btn1 = gtk_button_new_with_label ("Close window1"); GtkWidget *btn2 = gtk_button_new_with_label ("Close window2"); GtkWidget *labelA = gtk_label_new ("LABELA"); GtkWidget *labelB = gtk_label_new ("LABELB"); gtk_label_set_text(GTK_LABEL(labelA), "LABELAAAAAA"); gtk_label_set_text(GTK_LABEL(labelB), "LABELBBBBBB"); GtkWidget *box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); GtkWidget *box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_box_pack_start (GTK_BOX (box1), btn1, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), labelA, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box2), btn2, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box2), labelB, TRUE, TRUE, 0); g_signal_connect (btn1, "clicked", G_CALLBACK (end_program), NULL); g_signal_connect (win2, "delete_event", G_CALLBACK (end_program), NULL); gtk_container_add (GTK_CONTAINER (win1), box1); gtk_container_add (GTK_CONTAINER (win2), box2); gtk_widget_show_all (win1); gtk_widget_show_all (win2); gtk_main (); return 0; }

    结果

     2个新函数,gtk_box_new,gtk_box_pack_start函数细节见 https://developer.gnome.org/gtk3/stable/GtkBox.html

     点击按键,显示按键点击次数

    #include <gtk/gtk.h>
    
    void end_program (GtkWidget *wid, gpointer ptr)
    {
        printf("bybye
    ");
        gtk_main_quit ();
    }
    
    void count (GtkWidget *wid, gpointer ptr)
    {
        char buffer[30] = { 0 };
        static int count = 0;
        count++;
        sprintf (buffer, "Button pressed %d times", count);
        gtk_label_set_text (GTK_LABEL (ptr), buffer);
    }
    
    int main (int argc, char *argv[])
    {
        gtk_init (&argc, &argv);
    
        GtkWidget *win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        GtkWidget *win2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW(win1), "QT");
        gtk_window_set_title (GTK_WINDOW(win2), "GTK");
        gtk_window_set_default_size(GTK_WINDOW(win1), 120, 240);
        gtk_window_set_default_size(GTK_WINDOW(win2), 240, 120);
    
        GtkWidget *btn1 = gtk_button_new_with_label ("Close window1");
        GtkWidget *btn2 = gtk_button_new_with_label ("Close window2");
        GtkWidget *btn3 = gtk_button_new_with_label ("count
    ");
    
        GtkWidget *labelA = gtk_label_new ("LABELA");
        GtkWidget *labelB = gtk_label_new ("LABELB");
        gtk_label_set_text(GTK_LABEL(labelA), "LABELAAAAAA");
        gtk_label_set_text(GTK_LABEL(labelB), "LABELBBBBBB");
        GtkWidget *box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
        GtkWidget *box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
    
        gtk_box_pack_start (GTK_BOX (box1), btn1, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), labelA, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), btn3, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box2), btn2, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box2), labelB, TRUE, TRUE, 0);
    
        g_signal_connect (btn1, "clicked", G_CALLBACK (end_program), NULL);
        g_signal_connect (btn3, "clicked", G_CALLBACK (count), labelB);
        g_signal_connect (win2, "delete_event", G_CALLBACK (end_program), NULL);
    
        gtk_container_add (GTK_CONTAINER (win1), box1);
        gtk_container_add (GTK_CONTAINER (win2), box2);
    
        gtk_widget_show_all (win1);
        gtk_widget_show_all (win2);
        gtk_main ();
        return 0;
    }

    结果

    启动时

     点击count 按钮时

     点击count时,绑定多个label会如何呢

    #include <gtk/gtk.h>
    
    void end_program (GtkWidget *wid, gpointer ptr)
    {
        printf("bybye
    ");
        gtk_main_quit ();
    }
    
    void count (GtkWidget *wid, gpointer ptr)
    {
        char buffer[30] = { 0 };
        static int count= 0;
        count++;
        sprintf (buffer, "Button pressed %d times", count);
        gtk_label_set_text (GTK_LABEL (ptr), buffer);
    }
    
    int main (int argc, char *argv[])
    {
        gtk_init (&argc, &argv);
    
        GtkWidget *win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        GtkWidget *win2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW(win1), "QT");
        gtk_window_set_title (GTK_WINDOW(win2), "GTK");
        gtk_window_set_default_size(GTK_WINDOW(win1), 120, 240);
        gtk_window_set_default_size(GTK_WINDOW(win2), 240, 120);
    
        GtkWidget *btn1 = gtk_button_new_with_label ("Close window1");
        GtkWidget *btn2 = gtk_button_new_with_label ("Close window2");
        GtkWidget *btn3 = gtk_button_new_with_label ("count
    ");
    
        GtkWidget *labelA = gtk_label_new ("LABELA");
        GtkWidget *labelB = gtk_label_new ("LABELB");
        gtk_label_set_text(GTK_LABEL(labelA), "LABELAAAAAA");
        gtk_label_set_text(GTK_LABEL(labelB), "LABELBBBBBB");
        GtkWidget *box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
        GtkWidget *box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
    
        gtk_box_pack_start (GTK_BOX (box1), btn1, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), labelA, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), btn3, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box2), btn2, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box2), labelB, TRUE, TRUE, 0);
    
        g_signal_connect (btn1, "clicked", G_CALLBACK (end_program), NULL);
        g_signal_connect (btn3, "clicked", G_CALLBACK (count), labelB);
        g_signal_connect (btn3, "clicked", G_CALLBACK (count), labelA);
        g_signal_connect (win2, "delete_event", G_CALLBACK (end_program), NULL);
    
        gtk_container_add (GTK_CONTAINER (win1), box1);
        gtk_container_add (GTK_CONTAINER (win2), box2);
    
        gtk_widget_show_all (win1);
        gtk_widget_show_all (win2);
        gtk_main ();
        return 0;
    }

     结果,实际点击1次但显示2次,又碰到麻烦了,先归入待处理分类。

     

  • 相关阅读:
    iOS 11: CORE ML—浅析
    Android 平台 Native 代码的崩溃捕获机制及实现
    H5直播避坑指南
    Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法
    Android 4.4 KitKat终于支持录屏(Screen Recording)了!
    Android开发者资源大汇总
    用AndroidSDK中的Face Detector实现人脸识别
    [Android设计模式]Android退出应用程序终极方法
    ActionBarCompat 教程-实现Action Bar
    使用Roboguice依赖注入规划Android项目
  • 原文地址:https://www.cnblogs.com/goodluck14/p/13235832.html
Copyright © 2020-2023  润新知