#物聯網感知實驗#gtk佈局基礎

其他物聯網感知方面內容見:目錄

gtk框架

#include <gtk/gtk.h>
int  main(int argc,char *argv[])
{
	
	gtk_init(&argc,*argv);
 
 
    gtk_main();
	return 0;
}

使用gtk創建一個窗口

#include <gtk/gtk.h>
int  main(int argc,char *argv[])
{
	// 初始化gtk
	gtk_init(&argc,&argv);

	//寫的代碼
	//創建一個窗口  返回一個窗口控件的地址
	GtkWidget * win =  gtk_window_new(GTK_WINDOW_TOPLEVEL);

	//設置窗口的標題  參數1 窗口的地址  參數2 標題 字符串
	//gtk_window_set_title( GtkWindow *,char *)
	gtk_window_set_title((GtkWindow *)win,"千鋒and山科大");
	//設置窗口的大小
	gtk_widget_set_size_request(win,600,400);
	gtk_window_set_resizable((GtkWindow*)win,FALSE);//設置不可伸縮

	gtk_widget_show_all(win);//顯示一個控件 參數是控件的地址

	// 主事件循環  
	gtk_main();//作用是讓程序阻塞 捕捉事件

	
	return 0;
}

按鈕

#include <gtk/gtk.h>
#include <stdio.h>
int  main(int argc,char *argv[])
{
	// 初始化gtk
	gtk_init(&argc,&argv);

	//寫的代碼
	//創建一個窗口  返回一個窗口控件的地址
	GtkWidget * win =  gtk_window_new(GTK_WINDOW_TOPLEVEL);

	//設置窗口的標題  參數1 窗口的地址  參數2 標題 字符串
	//gtk_window_set_title( GtkWindow *,char *)
	gtk_window_set_title((GtkWindow *)win,"千鋒and山科大");
	//設置窗口的大小
	gtk_widget_set_size_request(win,600,400);
	gtk_window_set_resizable((GtkWindow*)win,FALSE);

	//創建一個帶label的按鈕

	GtkWidget * button =  gtk_button_new_with_label("千鋒");
	//按鈕添加到窗口
	gtk_container_add( (GtkContainer*)win,button);
	const gchar * str = gtk_button_get_label( (GtkButton*)button);
	printf("str=%s\n",str);


	gtk_widget_show_all(win);//顯示一個控件 參數是控件的地址

	// 主事件循環  
	gtk_main();//作用是讓程序阻塞 捕捉事件

	
	return 0;
}
  • 實現效果
    在這裏插入圖片描述

信號回調機制

  • 當控件被事件(鼠標,鍵盤)觸發,就會產生信號,我們可以設置信號與回調函數的機制
  • 當信號產生,那麼就會自動調用回調函數,這個回調函數的形參是什麼樣子,需要查看文檔
    在這裏插入圖片描述
#include <gtk/gtk.h>
#include <stdio.h>
void  cb( GtkButton *button,gpointer data)
{
	GtkWindow *wind = (GtkWindow*)data;
	gtk_window_set_title(wind,"千鋒物聯網");
	const gchar *str = gtk_button_get_label(button);
	printf("str=%s\n",str);
	printf("hello button\n");

}
void  cb1( GtkButton *button,gpointer data)//data =  &num
{
	int *p = (int*)data;
	printf("%d\n",*p);
	printf("hehe\n");
}
int  main(int argc,char *argv[])
{
	// 初始化gtk
	gtk_init(&argc,&argv);
	int num=1000;
	//寫的代碼
	//創建一個窗口  返回一個窗口控件的地址
	GtkWidget * win =  gtk_window_new(GTK_WINDOW_TOPLEVEL);

	//設置窗口的標題  參數1 窗口的地址  參數2 標題 字符串
	//gtk_window_set_title( GtkWindow *,char *)
	gtk_window_set_title((GtkWindow *)win,"千鋒and山科大");
	//設置窗口的大小
	gtk_widget_set_size_request(win,600,400);
	gtk_window_set_resizable((GtkWindow*)win,FALSE);

	//創建一個帶label的按鈕

	GtkWidget * button =  gtk_button_new_with_label("千鋒");
	//按鈕添加到窗口
	gtk_container_add( (GtkContainer*)win,button);
	const gchar * str = gtk_button_get_label( (GtkButton*)button);
	printf("str=%s\n",str);
	//註冊信號與回調函數的機制
	g_signal_connect(button,"pressed",G_CALLBACK(cb),win);
	g_signal_connect(button,"pressed",G_CALLBACK(cb1),&num);
	g_signal_connect(win,"destroy",G_CALLBACK(gtk_main_quit),NULL);

	gtk_widget_show_all(win);//顯示一個控件 參數是控件的地址

	// 主事件循環  
	gtk_main();//作用是讓程序阻塞 捕捉事件
	
	return 0;
}

水平佈局和垂直佈局

  • 水平佈局
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
	gtk_init(&argc,&argv);
	//創建並且設置窗口 
	GtkWidget *win =   gtk_window_new(GTK_WINDOW_TOPLEVEL);//創建窗口
	gtk_window_set_title((GtkWindow *)win,"hbox");//設置窗口的標題
	gtk_widget_set_size_request(win,400,300);//設置窗口的大小
	gtk_window_set_resizable((GtkWindow *)win,FALSE);//設置不可伸縮
	// 創建三個帶標籤的按鈕
	GtkWidget * button1 = gtk_button_new_with_label("c");
	GtkWidget * button2 = gtk_button_new_with_label("c++");
	GtkWidget * button3 = gtk_button_new_with_label("java");
	//創建水平佈局控件
	GtkWidget *hbox =  gtk_hbox_new(TRUE,5);
	//將按鈕添加到hbox
	gtk_container_add((GtkContainer*)hbox,button1);
	gtk_container_add((GtkContainer*)hbox,button2);
	gtk_container_add((GtkContainer*)hbox,button3);
	//將hbox添加到win
	gtk_container_add((GtkContainer*)win,hbox);
	// 顯示
	gtk_widget_show_all(win);	
	gtk_main();
	return 0;
}
  • 實現效果:
    在這裏插入圖片描述
  • 垂直佈局
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
	gtk_init(&argc,&argv);
	//創建並且設置窗口 
	GtkWidget *win =   gtk_window_new(GTK_WINDOW_TOPLEVEL);//創建窗口
	gtk_window_set_title((GtkWindow *)win,"vbox");//設置窗口的標題
	gtk_widget_set_size_request(win,400,300);//設置窗口的大小
	gtk_window_set_resizable((GtkWindow *)win,FALSE);//設置不可伸縮
	// 創建三個帶標籤的按鈕
	GtkWidget * button1 = gtk_button_new_with_label("c");
	GtkWidget * button2 = gtk_button_new_with_label("c++");
	GtkWidget * button3 = gtk_button_new_with_label("java");
	//創建水平佈局控件
	GtkWidget *vbox =  gtk_vbox_new(TRUE,5);
	//將按鈕添加到hbox
	gtk_container_add((GtkContainer*)vbox,button1);
	gtk_container_add((GtkContainer*)vbox,button2);
	gtk_container_add((GtkContainer*)vbox,button3);
	//將hbox添加到win
	gtk_container_add((GtkContainer*)win,vbox);
	// 顯示
	gtk_widget_show_all(win);	
	gtk_main();
	return 0;
}
  • 實現效果
    在這裏插入圖片描述

表格佈局

#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
	gtk_init(&argc,&argv);
	//創建並且設置窗口 
	GtkWidget *win =   gtk_window_new(GTK_WINDOW_TOPLEVEL);//創建窗口
	gtk_window_set_title((GtkWindow *)win,"vbox");//設置窗口的標題
	gtk_widget_set_size_request(win,400,300);//設置窗口的大小
	gtk_window_set_resizable((GtkWindow *)win,FALSE);//設置不可伸縮
	// 創建三個帶標籤的按鈕
	GtkWidget * button1 = gtk_button_new_with_label("c");
	GtkWidget * button2 = gtk_button_new_with_label("c++");
	GtkWidget * button3 = gtk_button_new_with_label("java");
	//設置按鈕背景透明
	gtk_button_set_relief((GtkButton*)button1,GTK_RELIEF_NONE);
	gtk_button_set_relief((GtkButton*)button2,GTK_RELIEF_NONE);
	gtk_button_set_relief((GtkButton*)button3,GTK_RELIEF_NONE);
	//創建一個表格佈局
	GtkWidget *table = gtk_table_new(2,2,TRUE);
	//將按鈕條件到表格
	gtk_table_attach_defaults( (GtkTable*)table,button1,0,1,0,1);
	gtk_table_attach_defaults( (GtkTable*)table,button2,1,2,0,1);
	gtk_table_attach_defaults( (GtkTable*)table,button3,0,2,1,2);	
	//將表格添加到win
	gtk_container_add((GtkContainer*)win,table);
	// 顯示
	gtk_widget_show_all(win);	
	gtk_main();
	return 0;
}
  • 實現效果
    在這裏插入圖片描述

固定佈局

#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
	gtk_init(&argc,&argv);
	//創建並且設置窗口 
	GtkWidget *win =   gtk_window_new(GTK_WINDOW_TOPLEVEL);//創建窗口
	gtk_window_set_title((GtkWindow *)win,"vbox");//設置窗口的標題
	gtk_widget_set_size_request(win,400,300);//設置窗口的大小
	gtk_window_set_resizable((GtkWindow *)win,FALSE);//設置不可伸縮
	// 創建三個帶標籤的按鈕
	GtkWidget * button1 = gtk_button_new_with_label("c");
	GtkWidget * button2 = gtk_button_new_with_label("c++");
	GtkWidget * button3 = gtk_button_new_with_label("java");
	//設置按鈕大小
	gtk_widget_set_size_request(button1,80,50);
	gtk_widget_set_size_request(button2,80,50);
	gtk_widget_set_size_request(button3,80,50);
	//創建一個固定佈局
	GtkWidget * fixed = gtk_fixed_new();
	//將按鈕添加到固定佈局
	gtk_fixed_put((GtkFixed *)fixed ,button1,80,100);
	gtk_fixed_put((GtkFixed *)fixed ,button2,240,100);
	gtk_fixed_put((GtkFixed *)fixed ,button3,160,200);
	
	//將fixed添加到win
	gtk_container_add((GtkContainer*)win,fixed);
	// 顯示
	gtk_widget_show_all(win);	
	gtk_main();
	return 0;
}
  • 實現效果
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章