鱼C论坛

 找回密码
 立即注册
查看: 2325|回复: 2

[技术交流] C语言GUI程序设计-GTK图文系列-输入部件

[复制链接]
发表于 2014-11-19 21:31:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这一讲讲解GTK中的输入部件,输入部件包括文本输入,数值选择,以及文本列表选择。这里将选择部件作为输入部件看待,GUI设计原则就是能让用户选的东西绝不要让用户输入,输入增加了操作的繁琐型及增大了系统的出错可能(用户输入未预期的值)。

效果图:
gtk_for_input.png

#include <gtk/gtk.h>

void get_name_click(GtkButton *button,gpointer user_data)
{
    guint16 length = 0;
    const gchar *name;

    length = gtk_entry_get_text_length(user_data);

    if(length)
    {
        name = gtk_entry_get_text(user_data);
        g_print("input name is: %s\n", name);
    }
    else
    {
        g_print("input empty!\n");
    }
}
void search_click(GtkButton *button,gpointer user_data)
{
    const gchar *keyword = gtk_entry_get_text(user_data);
    g_print("input word is: %s\n", keyword);
}
void cb_text_select(GtkComboBox *widget,gpointer user_data)
{
    gchar *value = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widget));
    g_print("you selected value is: %s\n", value);
}
int main(int argc,char *argv[ ])
{
    GtkWidget *window,*fixed;
    GtkWidget *entry_name,*label_name,*button_name;
    GtkWidget *entry_search,*label_search,*button_search;
    GtkWidget *mult_text;
    GtkWidget *scale,*spinner;
    GtkWidget *label_select,*cb_text;

    gtk_init(&argc,&argv);
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"hello fishc - for input");
    gtk_widget_set_size_request(GTK_WIDGET(window),300,300);

    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), fixed);

    label_name = gtk_label_new("Name: ");
    entry_name = gtk_entry_new();
    button_name = gtk_button_new_with_label("get name");
    g_signal_connect(GTK_WIDGET(button_name), "clicked", G_CALLBACK(get_name_click), entry_name);

    gtk_fixed_put(GTK_FIXED(fixed), label_name, 5,22);
    gtk_fixed_put(GTK_FIXED(fixed), entry_name, 50,20);
    gtk_fixed_put(GTK_FIXED(fixed), button_name, 220,16);

    label_search = gtk_label_new("Search: ");
    entry_search = gtk_search_entry_new();
    button_search = gtk_button_new_with_label("search");
    g_signal_connect(GTK_WIDGET(button_search), "clicked", G_CALLBACK(search_click), entry_search);
    gtk_entry_set_icon_from_stock(GTK_ENTRY(entry_search), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_FIND);

    gtk_fixed_put(GTK_FIXED(fixed), label_search, 5,52);
    gtk_fixed_put(GTK_FIXED(fixed), entry_search, 50,50);
    gtk_fixed_put(GTK_FIXED(fixed), button_search, 220,46);

    mult_text = gtk_text_view_new();
    gtk_widget_set_size_request(GTK_WIDGET(mult_text),290,100);
    gtk_fixed_put(GTK_FIXED(fixed), mult_text, 5,80);

    scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0,100,1);
    gtk_widget_set_size_request(GTK_WIDGET(scale),100,1);
    gtk_fixed_put(GTK_FIXED(fixed), scale, 5,180);

    spinner = gtk_spin_button_new_with_range(0,10,1);
    gtk_fixed_put(GTK_FIXED(fixed), spinner, 125,195);

    label_select = gtk_label_new("Please select an item: ");
    gtk_fixed_put(GTK_FIXED(fixed), label_select, 5,230);
    cb_text = gtk_combo_box_text_new();
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb_text), "aaaaa");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb_text), "bbb");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb_text), "cccc");
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb_text), "ffff");
    g_signal_connect(GTK_WIDGET(cb_text), "changed", G_CALLBACK(cb_text_select), NULL);
    gtk_fixed_put(GTK_FIXED(fixed), cb_text, 150,225);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
其中的GtkScale和GtkSpinButton在按钮部件那一讲说过的,这里就不再赘述。GtkScale和GtkVolumeButton一样的。

GtkEntry

GtkEntry是一个单行文本输入部件,可以用来让用户输入一些字符串数据,如:用户名,密码,这些。
默认输入的文本是明文显示的,如果要输入密码,通过gtk_entry_set_visibility函数设置输入字符以掩码方式显示,这个函数需要两个参数,第一个是GtkEntry部件,第二个是设置是否显示的布尔值参数。通过gtk_entry_get_text_length函数可以获取输入框中字符个数,可以用来判断输入是否为空。
gtk_entry_get_text函数用来获取用户输入的文本信息。

GtkSearchEntry

GtkSearchEntry和GtkEntry是一样的,它“继承”于GtkEntry,不过默认状态下显示一个图标,这个图标通过gtk_entry_set_icon_from_stock函数设置,stock还是之前提到的预定义图标。
gtk_entry_set_icon_from_stock函数有三个参数:
第一个是GtkEntry部件,第二个是图标显示位置,可以为首部显示或尾部显示,其值为枚举:
typedef enum {
  GTK_ENTRY_ICON_PRIMARY,
  GTK_ENTRY_ICON_SECONDARY
} GtkEntryIconPosition;
第三个参数为显示的stockid,是一些定义过的宏,直接拿来用即可。

GtkTextView

GtkTextView也是文本输入框,和GtkEntry的不同之处在于它可以输入多行文本。默认情况下是不现实滚动条的,会自扩展高度,如果要显示滚动条,把它放到可以滚动的布局部件(GtkScrolledWindow)里即可,在前面讲布局部件时提到过。


GtkComboBoxText

GtkComboBoxText是一个简单的只读组合框,比较常用,用来为用户提供一组预期值选择。例如:要输入一个月份,可以把12个月份放入这个部件供用户选择。
gtk_combo_box_text_append_text函数用来为组合框添加文本项,这个函数有两个参数,第一个为组合框部件,第二个为要添加的文本,以追加方式添加到组合框的项列表中。
另外提供gtk_combo_boc_text_insert函数用来插入值,可以插入到项列表的不同位置。通过第二个参数position指定插入在哪个索引项后面。
通过注册 changed 信号来获取组合框选择项改变通知。

这一讲就简单地说这么多,下一讲讲解GTK中的对话框(dialog)。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-19 21:43:26 | 显示全部楼层
学习了   窗口编程好麻烦啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 13:25:14 | 显示全部楼层
高手啊。Gtk的代码感觉上不如MFC的多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 10:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表