这次学习记录的目标为:
#include <gtk/gtk.h>
gulong handlder_id;
static void load_css(void);
static GtkWidget *create_window(const gint, const gint);
static GtkWidget *createGrid(guint, gboolean, gboolean, guint, guint);
void toggled_cb(GtkCheckButton *checkbutton, gpointer data);
void checked_cb(GtkCheckButton *checkbutton);
void button_click_cb(GtkButton *button)
{
static gulong temp;
if (temp == 0)
temp = handlder_id;
if (temp == handlder_id)
g_print("请选中CHECKBUTTON\n");
else
g_print("GOODBYE\n");
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
load_css();
GtkWidget *window;
GtkWidget *grid;
GtkWidget *check_Butoon1;
GtkWidget *check_Butoon2;
GtkWidget *check_Butoon3;
GtkWidget *button;
window = create_window(400, 300);
grid = createGrid(3, FALSE, FALSE, 3, 3);
button = gtk_button_new_with_label("Quit");
// check_Butoon1 = gtk_check_button_new();
// 创建一个带文本标签的checkButton
// check_Butoon2 = gtk_check_button_new_with_label("Check the Button");
// 当按下Alt键时,会在带有'_'前的字母出现下划线,如下,比如按下Alt+c会选中
check_Butoon3 = gtk_check_button_new_with_mnemonic("_Check the Button to Quit");
handlder_id = g_signal_connect(check_Butoon3, "toggled", G_CALLBACK(toggled_cb), button);
// g_signal_connect_swapped(check_Butoon3, "checked", G_CALLBACK(checked_cb), button);
// 设置部件的敏感度,FALSE即不能与用户进行交互
// gtk_widget_set_sensitive(button, FALSE);
if (handlder_id != 0)
g_signal_connect_swapped(button, "clicked", G_CALLBACK(button_click_cb), button);
gtk_container_add(GTK_CONTAINER(window), grid);
// gtk_grid_attach(GTK_GRID(grid), check_Butoon1, 0, 0, 1, 1);
// gtk_grid_attach(GTK_GRID(grid), check_Butoon2, 1, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), check_Butoon3, 2, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), button, 2, 2, 1, 1);
gtk_widget_show_all(window);
gtk_main();
}
static GtkWidget *create_window(const gint w, const gint h)
{
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_default_size(GTK_WINDOW(window), w, h);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(window), "Hello Grid");
gtk_container_set_border_width(GTK_CONTAINER(window), 25);
return window;
}
static void load_css(void)
{
GtkCssProvider *provider;
GdkDisplay *display;
GdkScreen *screen;
const char *css_style_file = "style.css";
GFile *css_fp = g_file_new_for_path(css_style_file);
GError *error = 0;
provider = gtk_css_provider_new();
display = gdk_display_get_default();
screen = gdk_display_get_default_screen(display);
gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
gtk_css_provider_load_from_file(provider, css_fp, &error);
g_object_unref(provider);
}
static GtkWidget *createGrid(guint border,
gboolean row_homogeneous,
gboolean column_homogeneous,
guint row_spacing,
guint column_spacing)
{
GtkWidget *grid = gtk_grid_new();
gtk_grid_set_row_homogeneous(GTK_GRID(grid), row_homogeneous);
gtk_grid_set_column_homogeneous(GTK_GRID(grid), column_homogeneous);
gtk_grid_set_row_spacing(GTK_GRID(grid), row_spacing);
gtk_grid_set_column_spacing(GTK_GRID(grid), column_spacing);
gtk_container_set_border_width(GTK_CONTAINER(grid), border);
g_object_set(grid,
"tooltip-text", "Grid",
NULL);
return grid;
}
void toggled_cb(GtkCheckButton *checkbutton, gpointer data)
{
(GtkButton *)data;
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton)))
{
handlder_id = g_signal_connect(data, "clicked", G_CALLBACK(gtk_main_quit),
NULL);
}
else
{
g_signal_handler_disconnect(data, handlder_id);
}
}
// style.css
window {
background-color:bisque;
}
grid {
background-color: coral;
}
checkbutton {
background-color: darksalmon;
color: red;
border-width: 20px;
min-width: 10px;
min-height: 10px;
margin: 25px;
}
/*
active
focus
hover
checked
*/
/*
checkbutton:active {
background-color: rosybrown;
color: seagreen;
}
checkbutton:focus {
background-color: seashell;
color: sienna;
}
checkbutton:hover {
background-color: skyblue;
color: khaki;
}
checkbutton:checked {
background-color: lawngreen;
}
*/
button {
background-color: lightblue;
color: black;
}
button:hover {
background-color: black;
color: white;
}
- 运行效果:
例子的功能描述的是,当没有选中checkButton
的时候,点击Quit
按钮是不能完成退出功能的。只有在选中checkButton
后,点击Quit
按钮才能退出。链接css
文件时,只能使用checkbutton
作为选择器名字进行链接。