GTK tutorial 十三

2024-06-14 17:44
文章标签 tutorial 十三 gtk

本文主要是介绍GTK tutorial 十三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spin Buttons

Spin Button用于让用户在一个范围内的数值中选择一个数字。它包含一个text entry box,并且在entry box旁边有用于上下翻的箭头按钮。entry box也能够直接被编辑。

下面举例说明其用法。

程序运行结果:

/**spinbutton.c/
#include<stdio.h>
#include<gtk/gtk.h>static GtkWidget *spinner1;static void toggle_snap(GtkWidget *widget, GtkSpinButton *spin)
{gtk_spin_button_set_snap_to_ticks(spin, GTK_TOGGLE_BUTTON(widget)->active);
}static void toggle_numeric(GtkWidget *widget, GtkSpinButton *spin)
{gtk_spin_button_set_numeric(spin, GTK_TOGGLE_BUTTON(widget)->active);
}static void change_digits(GtkWidget *widget, GtkSpinButton *spin)
{gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinner1), gtk_spin_button_get_value_as_int(spin));
}static void get_value(GtkWidget *widget, gpointer data)
{gchar *buf;GtkLabel *label;GtkSpinButton *spin;spin = GTK_SPIN_BUTTON(spinner1);label = GTK_LABEL(g_object_get_data(G_OBJECT(widget), "user_data"));if(GPOINTER_TO_INT(data) == 1)buf = g_strdup_printf("%d", gtk_spin_button_get_value_as_int(spin));elsebuf = g_strdup_printf("%0.*f", spin->digits, gtk_spin_button_get_value(spin));gtk_label_set_text(label, buf);g_free(buf);
}int main(int argc, char *argv[])
{GtkWidget *window;GtkWidget *frame;GtkWidget *hbox;GtkWidget *main_vbox;GtkWidget *vbox;GtkWidget *vbox2;GtkWidget *spinner2;GtkWidget *spinner;GtkWidget *button;GtkWidget *label;GtkWidget *val_label;GtkAdjustment *adj;gtk_init(&argc, &argv);window = gtk_window_new(GTK_WINDOW_TOPLEVEL);g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);gtk_window_set_title(GTK_WINDOW(window), "Spin Button");main_vbox = gtk_vbox_new(FALSE, 5);gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 10);gtk_container_add(GTK_CONTAINER(window), main_vbox);frame = gtk_frame_new("Not accelerated");gtk_box_pack_start(GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);vbox = gtk_vbox_new(FALSE, 0);gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);gtk_container_add(GTK_CONTAINER(frame), vbox);hbox = gtk_hbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);vbox2 = gtk_vbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);label = gtk_label_new("Day:");gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);adj = (GtkAdjustment *)gtk_adjustment_new(1.0, 1.0, 31.0, 1.0, 5.0, 0.0);spinner = gtk_spin_button_new(adj, 0, 0);gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);vbox2 = gtk_vbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);label = gtk_label_new("Month:");gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);adj = (GtkAdjustment *)gtk_adjustment_new(1.0, 1.0, 12.0, 1.0, 5.0, 0.0);spinner = gtk_spin_button_new(adj, 0, 0);gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);vbox2 = gtk_vbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);label = gtk_label_new("Year:");gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, FALSE, 0);adj = (GtkAdjustment *)gtk_adjustment_new(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0);spinner = gtk_spin_button_new(adj, 0, 0);gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner), TRUE);gtk_widget_set_size_request(spinner, 55, -1);gtk_box_pack_start(GTK_BOX(vbox2), spinner, FALSE, TRUE, 0);frame = gtk_frame_new("Accelerated");gtk_box_pack_start(GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);vbox = gtk_vbox_new(FALSE, 0);gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);gtk_container_add(GTK_CONTAINER(frame), vbox);hbox = gtk_hbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);vbox2 = gtk_vbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);label = gtk_label_new("Value:");gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, TRUE, 0);adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -1000.0, 1000.0, 0.5, 100.0, 0.0);spinner1 = gtk_spin_button_new(adj, 1.0, 2);gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner1), TRUE);gtk_widget_set_size_request(spinner, 100, -1);gtk_box_pack_start(GTK_BOX(vbox2), spinner1, FALSE, TRUE, 0);vbox2 = gtk_vbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 5);label = gtk_label_new("Digits:");gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);gtk_box_pack_start(GTK_BOX(vbox2), label,FALSE, TRUE, 0);adj = (GtkAdjustment *)gtk_adjustment_new(2, 1, 5, 1, 1, 0);spinner2 = gtk_spin_button_new(adj, 0, 0);gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinner2), TRUE);g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(change_digits), (gpointer) spinner2);gtk_box_pack_start(GTK_BOX(vbox2), spinner2, FALSE, TRUE, 0);hbox = gtk_hbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);button = gtk_check_button_new_with_label("Snap to 0.5-ticks");g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_snap), (gpointer)spinner1);gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);button = gtk_check_button_new_with_label("Numeric only input mode");g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_numeric), (gpointer)spinner1);gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);val_label = gtk_label_new("");hbox = gtk_hbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);button = gtk_button_new_with_label("Value as Int");g_object_set_data(G_OBJECT(button), "user_data", val_label);g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(get_value), GINT_TO_POINTER(1));gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);button = gtk_button_new_with_label("Value as Float");g_object_set_data(G_OBJECT(button), "user_data", val_label);g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(get_value), GINT_TO_POINTER(2));gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);gtk_box_pack_start(GTK_BOX(vbox), val_label, TRUE, TRUE, 0);gtk_label_set_text(GTK_LABEL(val_label), "0");hbox = gtk_hbox_new(FALSE, 0);gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, TRUE, 0);button = gtk_button_new_with_label("Close");g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);gtk_widget_show_all(window);gtk_main();return 0;}

编译命令:

gcc -Wall -g spinbutton.c -o spinbutton `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

 Combo Box

Combox Box是一个widget的集合。它包含一个text entry box和一个下拉菜单。通过下拉菜单可以选择其中的项,也可以在text entry box中键入字符串。

下面举例说明。

程序运行结果:

 

/**combobox.c/#include<gtk/gtk.h>void on_combo_box_changed(GtkComboBox *combo_box, gpointer user_data)
{gint active_index = gtk_combo_box_get_active(combo_box);if(active_index != -1){GtkTreeModel *model;GtkTreeIter iter;gchar *item_text;model = gtk_combo_box_get_model(combo_box);gtk_tree_model_iter_nth_child(model, &iter, NULL, active_index);gtk_tree_model_get(model, &iter, 0, &item_text, -1);g_print("Selected item: %s\n", item_text);g_free(item_text);}
}int main(int argc, char *argv[])
{GtkWidget *window;GtkWidget *combo_box;GtkList *glist = NULL;GtkTreeIter iter;gtk_init(&argc, &argv);window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window), "GTK ComboBox Example");gtk_window_set_default_size(GTK_WINDOW(window), 250, 150);g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);combo_box = gtk_combo_new();glist = g_list_append(glist, "String 1");glist = g_list_append(glist, "String 2");glist = g_list_append(glist, "String 3");glist = g_list_append(glist, "String 4");gtk_combo_set_popdown_strings(GTK_COMBO(combo_box), glist);g_signal_connect(combo_box, "changed", G_CALLBACK(on_combo_box_changed), NULL);gtk_container_add(GTK_CONTAINER(window), combo_box);gtk_widget_show_all(window);gtk_main();return 0;}

编译命令:

gcc -Wall -g combobox.c -o combobox `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

 Calendar

如标题,这是一个用于显示日历的widget.下面我们举例说明其UI及其相关功能。

程序运行结果如下:

/*calendar.c*/
#include<stdio.h>
#include<string.h>
#include<gtk/gtk.h>#define DEF_PAD         10
#define DEF_PAD_SAMLL   5#define TM_YEAE_BASE    1900typedef struct _CalendarData{GtkWidget *flag_checkboxes[5];gboolean settings[5];GtkWidget *font_dialog;GtkWidget *window;GtkWidget *prev2_sig;GtkWidget *prev_sig;GtkWidget *last_sig;GtkWidget *month;
}CalendarData;enum{calendar_show_header,calendar_show_days,calendar_month_change,calendar_show_week,calendar_monday_first
};static void calendar_data_to_string(CalendarData *data, char *buffer,gint buffer_len)
{GDate date;guint year, month, day;gtk_calendar_get_date(GTK_CALENDAR(data->window), &year, &month, &day);g_date_set_dmy(&date, day, month + 1, year);g_date_strftime(buffer, buffer_len -1, "%x", &date);
}static void calendar_set_signal_strings(char *sig_str, CalendarData *data)
{const gchar *prev_sig;prev_sig = gtk_label_get_text(GTK_LABEL(data->prev2_sig));gtk_label_set_text(GTK_LABEL(data->prev2_sig), prev_sig);prev_sig = gtk_label_get_text(GTK_LABEL(data->last_sig));gtk_label_set_text(GTK_LABEL(data->prev_sig), prev_sig);gtk_label_set_text(GTK_LABEL(data->last_sig), sig_str);}static void calendar_month_changed(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "month_changed: ";calendar_data_to_string(data, buffer + 15, 256 - 15);calendar_set_signal_strings(buffer, data);
}static void calendar_day_selected(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "day_selected: ";calendar_data_to_string(data, buffer + 14, 256 - 14);calendar_set_signal_strings(buffer, data);
}static void calendar_day_selected_double_click(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "day_selected_double_click: ";guint day;calendar_data_to_string(data, buffer + 27, 256 - 27);calendar_set_signal_strings(buffer, data);gtk_calendar_get_date(GTK_CALENDAR(data->window), NULL, NULL, &day);if(GTK_CALENDAR(data->window)->marked_date[day - 1] == 0)gtk_calendar_mark_day(GTK_CALENDAR(data->window), day);elsegtk_calendar_unmark_day(GTK_CALENDAR(data->window), day);
}static void calendar_prev_month(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "prev_month: ";calendar_data_to_string(data, buffer + 12, 256 - 12);calendar_set_signal_strings(buffer, data);
}static void calendar_next_month(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "next_month: ";calendar_data_to_string(data, buffer + 12, 256 - 12);calendar_set_signal_strings(buffer, data);
}static void calendar_prev_year(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "prev_year: ";calendar_data_to_string(data, buffer + 11, 256 - 11);calendar_set_signal_strings(buffer, data);
}static void calendar_next_year(GtkWidget *widget, CalendarData *data)
{char buffer[256] = "next_year: ";calendar_data_to_string(data, buffer + 11, 256 - 11);calendar_set_signal_strings(buffer, data);
}static void calendar_set_flags(CalendarData *calendar)
{gint i;gint options = 0;for ( i = 0; i < 5; i++){if(calendar->settings[i])options = options + (1<<i);            }if(calendar->window)gtk_calendar_display_options(GTK_CALENDAR(calendar->window), options);}static void calendar_toggle_flag(GtkWidget *toggle, CalendarData *calendar)
{gint i;gint j;j = 0;for ( i = 0; i < 5; i++){if(calendar->flag_checkboxes[i] == toggle)j = i;}calendar->settings[j] = !calendar->settings[j];calendar_set_flags(calendar);}static void calendar_font_selection_ok(GtkWidget *button, CalendarData *calendar)
{GtkRcStyle *style;char *font_name;if(calendar->window){font_name = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(calendar->font_dialog));if(font_name){style = gtk_rc_style_new();pango_font_description_free(style->font_desc);style->font_desc = pango_font_description_from_string(font_name);gtk_widget_modify_style(calendar->window, style);g_free(font_name);}}gtk_widget_destroy(calendar->font_dialog);
}static void calendar_select_font(GtkWidget *button, CalendarData *calendar)
{GtkWidget *window;if(!calendar->font_dialog){window = gtk_font_selection_dialog_new("Font Selection Dialog");g_return_if_fail(GTK_IS_FONT_SELECTION_DIALOG(window));calendar->font_dialog = window;gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);g_signal_connect(window, "destroy",G_CALLBACK(gtk_widget_destroyed), &calendar->font_dialog);g_signal_connect(GTK_FONT_SELECTION_DIALOG(window)->ok_button, "clicked",G_CALLBACK(calendar_font_selection_ok), calendar);g_signal_connect_swapped(GTK_FONT_SELECTION_DIALOG(window)->cancel_button, "clicked",G_CALLBACK(gtk_widget_destroy), calendar->font_dialog);}window = calendar->font_dialog;if(!GTK_WIDGET_VISIBLE(window))gtk_widget_show(window);elsegtk_widget_destroy(window);
}static void create_calendar(void)
{GtkWidget *window;GtkWidget *vbox;GtkWidget *vbox2;GtkWidget *vbox3;GtkWidget *hbox;GtkWidget *hbbox;GtkWidget *calendar;GtkWidget *toggle;GtkWidget *button;GtkWidget *frame;GtkWidget *separator;GtkWidget *label;GtkWidget *bbox;static CalendarData calendar_data;gint i;struct {char *label;} flags[] ={{"Show Heading"},{"Show Day Names"},{"No Month Change"},{"Show Week Numbers"},{"Week Start Monday"}};calendar_data.window = NULL;calendar_data.font_dialog = NULL;for ( i = 0; i < 5; i++){calendar_data.settings[i] = 0;}window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window), "GtkCalendar Example");gtk_container_set_border_width(GTK_CONTAINER(window), 5);g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);g_signal_connect(window, "delete-event", G_CALLBACK(gtk_false), NULL);gtk_window_set_resizable(GTK_WINDOW(window), FALSE);vbox = gtk_vbox_new(FALSE, DEF_PAD);gtk_container_add(GTK_CONTAINER(window), vbox);hbox = gtk_hbox_new(FALSE, DEF_PAD);gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, DEF_PAD);hbbox = gtk_hbutton_box_new();gtk_box_pack_start(GTK_BOX(hbox), hbbox, FALSE, FALSE, DEF_PAD);gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_SPREAD);gtk_box_set_spacing(GTK_BOX(hbbox), 5);frame = gtk_frame_new("calendar");gtk_box_pack_start(GTK_BOX(hbbox), frame, FALSE, TRUE, DEF_PAD);calendar = gtk_calendar_new();calendar_data.window = calendar;calendar_set_flags(&calendar_data);gtk_calendar_mark_day(GTK_CALENDAR(calendar), 19);gtk_container_add(GTK_CONTAINER(frame), calendar);g_signal_connect(calendar, "month_changed", G_CALLBACK(calendar_month_changed), &calendar_data);g_signal_connect(calendar, "day_selected", G_CALLBACK(calendar_day_selected), &calendar_data);g_signal_connect(calendar, "day_selected_double_click", G_CALLBACK(calendar_day_selected_double_click), &calendar_data);g_signal_connect(calendar, "prev_month", G_CALLBACK(calendar_prev_month), &calendar_data);g_signal_connect(calendar, "next_month", G_CALLBACK(calendar_next_month), &calendar_data);g_signal_connect(calendar, "prev_year", G_CALLBACK(calendar_prev_year), &calendar_data);g_signal_connect(calendar, "next_year", G_CALLBACK(calendar_next_year), &calendar_data);separator = gtk_vseparator_new();gtk_box_pack_start(GTK_BOX(hbox), separator, FALSE, TRUE, 0);vbox2 = gtk_vbox_new(FALSE, DEF_PAD);gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, DEF_PAD);frame = gtk_frame_new("flags");gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, DEF_PAD);vbox3 = gtk_vbox_new(TRUE, DEF_PAD_SAMLL);gtk_container_add(GTK_CONTAINER(frame), vbox3);for ( i = 0; i < 5; i++){toggle = gtk_check_button_new_with_label(flags[i].label);g_signal_connect(toggle, "toggled", G_CALLBACK(calendar_toggle_flag), &calendar_data);gtk_box_pack_start(GTK_BOX(vbox3), toggle, TRUE, TRUE, 0);calendar_data.flag_checkboxes[i] = toggle;}button = gtk_button_new_with_label("Font...");g_signal_connect(button, "clicked",G_CALLBACK(calendar_select_font), &calendar_data);gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);frame = gtk_frame_new("Signal events");gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, DEF_PAD);vbox2 = gtk_vbox_new(TRUE, DEF_PAD_SAMLL);gtk_container_add(GTK_CONTAINER(frame), vbox2);hbox = gtk_hbox_new(FALSE, 3);gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);label = gtk_label_new("Signal:");gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);calendar_data.last_sig = gtk_label_new("");gtk_box_pack_start(GTK_BOX(hbox), calendar_data.last_sig, FALSE, TRUE, 0);hbox = gtk_hbox_new(FALSE, 3);gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);label = gtk_label_new("Previous signal:");gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);calendar_data.prev_sig = gtk_label_new("");gtk_box_pack_start(GTK_BOX(hbox), calendar_data.prev_sig, FALSE, TRUE, 0);hbox = gtk_hbox_new(FALSE, 3);gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);label = gtk_label_new("Second previous signal:");gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);calendar_data.prev2_sig = gtk_label_new("");gtk_box_pack_start(GTK_BOX(hbox), calendar_data.prev2_sig, FALSE, TRUE, 0);bbox = gtk_hbutton_box_new();gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);button = gtk_button_new_with_label("close");g_signal_connect(button, "clicked",G_CALLBACK(gtk_main_quit), NULL);gtk_container_add(GTK_CONTAINER(bbox), button);GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);gtk_widget_grab_default(button);gtk_widget_show_all(window);}int main(int argc, char *argv[])
{gtk_init(&argc, &argv);create_calendar();gtk_main();return 0;
}

 编译命令:

gcc -Wall -g calendar.c -o calendar `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`

这篇关于GTK tutorial 十三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061090

相关文章

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧

十三、我们应当怎样做需求分析:查询报表分析

在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有些功能来说总感觉不对劲。感觉不对劲的,就是那些查询、汇总与报表功能。对于这部分功能,需要我们描述的不是什么操作流程,而更重要的是那些数据项、数据来源、报表格式、数据链接,以及使用者、使用频率的说明。而这些,在以往的用例说明格式中统统都没有,怎么办呢?俗话说“东西是死的人是活的”,把我们的用例格式改改吧。

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

Kafka【十三】消费者消费消息的偏移量

偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下,消费者如果不指定消费主题数据的偏移量,那么消费者启动消费时,无论当前主题之前存储了多少历史数据,消费者只能从连接成功后当前主题最新的数据偏移位置读取,而无法读取之前的任何数据。如果想要获取之前的数据,就需要设定配置参数或指定数据偏移量。 【1】起始偏移量 在消费者的配置中,我们可以增加偏移量相关参数auto.offset.re

超详细!!!electron-vite-vue开发桌面应用之应用更新版本提示(十三)

云风网 云风笔记 云风知识库 当项目应用包更新后应该主动提示用户更新,这是采用electron-updater进行更新提示 一、安装依赖 npm i electron-updater 二、配置安装包更新地址 electron-builder.json5添加配置 // 配置安装包更新地址publish: [{provider: "generic",url: "http://w

2024 Python3.10 系统入门+进阶(十三):函数进阶

目录 一、匿名函数(lambda)1.1 定义匿名函数及其简单运用1.2 collections模块之defaultdict详解(拓展) 二、生成器函数2.1 生成器函数2.2 生成器结合关键字in使用时注意事项2.3 yield from语法 三、函数执行原理四、递归函数五、高阶函数柯里化5.1 函数合成5.2 函数柯里化 一、匿名函数(lambda) 1.1 定义匿名函数及

Flink实例(114):自定义时间和窗口的操作符(十三)自定义窗口分配器之设定窗口开始与结束时刻

1. 自定义窗口分配器(flink1.11.2) package com.atguigu.exercise.ETL.caiutilimport java.text.SimpleDateFormatimport java.utilimport java.util.{Collections, Date}import org.apache.flink.api.common.Executio

Spark学习之路 (十三)SparkCore的调优之资源调优JVM的基本架构

《2021年最新版大数据面试题全面开启更新》 欢迎关注github《大数据成神之路》   目录 一、JVM的结构图 1.1 Java内存结构 1.2 如何通过参数来控制各区域的内存大小 1.3 控制参数 1.4 JVM和系统调用之间的关系 二、JVM各区域的作用 2.1 Java堆(Heap) 2.2 方法区(Method Area) 2.3 程序计数器(Program Counter R

ArcGIS Pro SDK (十三)地图创作 3 特殊图层

ArcGIS Pro SDK (十三)地图创作 3 特殊图层 文章目录 ArcGIS Pro SDK (十三)地图创作 3 特殊图层1 高程表面图层1.1 创建具有地表图层的场景1.2 创建新的高程表面1.3 将自定义高程表面设置为 Z 感知图层1.4 将高程源添加到现有高程表面图层1.5 从地图中获取高程表面图层和高程源图层1.6 查找高程表面图层1.7 移除高程表面图层1.8 从曲面获