一、带有按钮的窗口
开发流程:
看自己的需求
画出自己的设计图
写中文流程
按照中文流程写代码
一点点保存、编译运行看结果、调试
包含头文件include
写主函数main
环境初始化gtk_init
创建窗口gtk_window_new
设置窗口属性
创建一个按钮
将按钮放入到窗口中
显示窗口上面的所有内容gtk_widget_show_all
主事件循环gtk_main
return 0;
我们需要的新的函数声明为:
创建一个带内容的按钮
GtkWidget *gtk_button_new_with_label(const gchar *label );
获得按钮上面的文本内容
const gchar *gtk_button_get_label(GtkButton *button );
把控件添加到窗口容器里
void gtk_container_add(GtkContainer*container,GtkWidget*widget);
container:容纳控件的容器;widget:要添加的控件
代码:
#include //gtk的头文件#include int main(int argc, char *argv[])//main函数需要去掉const{
//环境初始化gtk_init(&argc,&argv);
//创建窗口GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//创建按钮GtkWidget* button = gtk_button_new_with_label("请戳我");
//将按钮放入窗口gtk_container_add(GTK_CONTAINER(window),button);
gtk_widget_show_all(window);
//信号连接g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_main();
return 0;
}
效果
如果我希望按钮按下的时候会有一些功能
我们需要使用信号连接
二、信号连接的正常使用
g_signal_connect(谁发出的信号,发出了什么信号,调用的回调函数,给回调函数的参数);
当前我们的按钮可以触发的信号:
窗口关闭时触发的常用信号:destroy, delete-event
操作按钮触发的常用信号:clicked, pressed,released
g_signal_connect(button,"pressed",G_CALLBACK(hahaha),"疼");
void hahaha(GtkButton*button, gpointer user_data);
开发流程:
1.写界面代码
2.写界面中的信号连接:当xxxx触发xx信号的时候你就会调用xxxxxx函数实现xxxxx功能
3.你会发现你的信号连接对应的回调函数不存在,因此需要定义这个回调函数
4.你会发现你的my_haha函数未声明,因为你调用的位置在定义的位置之上
因此向前声明一下这个函数(复制函数第一行,粘贴到最上方并且加;)
代码:
#include //gtk的头文件#include void my_haha(GtkButton* button,gpointer user_data);//向前声明
int main(int argc, char *argv[])//main函数需要去掉const{
//环境初始化gtk_init(&argc,&argv);
//创建窗口GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//创建按钮GtkWidget* button1 = gtk_button_new_with_label("请戳我");
//将按钮放入窗口gtk_container_add(GTK_CONTAINER(window),button1);
gtk_widget_show_all(window);
//信号连接g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect(button1,"pressed",G_CALLBACK(my_haha),"疼");
gtk_main();
return 0;
}
void my_haha(GtkButton* button,gpointer user_data)
{
//1我们可以打印按钮上面的内容(先获取按钮上的内容,然后打印,或者直接获取打印)const char * haha = gtk_button_get_label(button);
printf("%s\n", haha);//调用之后接返回值让后打印返回值printf("%s\n", gtk_button_get_label(button));//直接打印返回值//2我们可以打印传递过来的参数---疼printf("%s\n", (char *)user_data);//本身是gpointer类型,但是我们打印%是,所以强转}
如果我们向窗口中放入多个按钮
有的小伙伴说,我复制粘贴就可以了
以上就是我们报的错误,为什么呢?因此窗口属于只能容纳一个控件的容器控件
控件:界面上可见的东西
容器控件:能容纳控件的控件
只能容纳一个控件的容器控件:窗口、按钮(按钮上什么都没有、就有文本、有图片)
能容纳多个控件的容器控件:布局(你可以看查画板)
非容器控件:label、entry
三、布局: