Linux学习笔记
----GTK入门【0609】
Written By Pingf
简单记录一下,下面的代码基本来自gtk的官网,加了些中文的注释便于理解,仅次而已。
例程1 简单使用
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
//最简单的GTK程序测试
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
//声明窗口构件
GtkWidget *window;
//gtk初始化
gtk_init(&argc, &argv);
//窗口布局
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//gtk_window_set_title(GTK_WINDOW(window), "hello,gtk!");
//上面这行代码用来设置窗口的标题,不设置的情况下,标题同工程名
//将窗口show出来
gtk_widget_show(window);
//消息循环
gtk_main();
return 0;
}
例程2 窗体居中
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
//窗体构建
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//命名
gtk_window_set_title(GTK_WINDOW(window), "Center");
//设置大小
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
//放置在屏幕的中央
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);
g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
//在上一个程序中,点击关闭按钮程序并没有真正的推出,
//仅仅是销毁了窗口而已
//将destroy连接到gtk内部的退出函数
gtk_main();
return 0;
}
例程3 设置图标
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include <gtk/gtk.h>
//读取pixbuf
GdkPixbuf *create_pixbuf(const gchar * filename)
{
//GDK比GTK的层次更低,pixbuf指针用来获取图片
GdkPixbuf *pixbuf;
//error指针用来检测错误
GError *error = NULL;
//对于多帧的图片则可用gdk_pixbuf_animation_new_from_file来获取,但要注意窗体的限制
pixbuf = gdk_pixbuf_new_from_file(filename, &error);
if (!pixbuf)
{
fprintf(stderr, "%s\n", error->message);
//在打开出错[包括文件不存在]的情况下error中会有出错信息产生
//将error信息显示完毕后,应通过g_error_free来释放
//如果没有错误产生error一直为NULL,不用释放
g_error_free(error);
}
return pixbuf;
}
int main( int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "icon");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
//设置ICON
gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("test.png"));
gtk_widget_show(window);
g_signal_connect_swapped(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}
例程4 按钮操作
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
#include <gtk/gtk.h>
gint count = 0;
char buf[5];
void increase(GtkWidget *widget, gpointer label)
{
count++;
sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
}
void decrease(GtkWidget *widget, gpointer label)
{
count--;
sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
}
int main(int argc, char** argv)
{
//标签
GtkWidget *label;
//窗体
GtkWidget *window;
//框架
GtkWidget *frame;
//按钮
GtkWidget *plus;
//按钮
GtkWidget *minus;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 180);
gtk_window_set_title(GTK_WINDOW(window), "+-");
//fixed_new产生确定位置的窗体,和其它GTK窗体构建不同
//其不会随着窗体比例的改变而改变
frame = gtk_fixed_new();
//将frame加入windows
gtk_container_add(GTK_CONTAINER(window), frame);
//声明button窗体
plus = gtk_button_new_with_label("+");
//设置窗体的大小
gtk_widget_set_size_request(plus, 80, 35);
//将窗体加入fixed框架
gtk_fixed_put(GTK_FIXED(frame), plus, 50, 20);
minus = gtk_button_new_with_label("-");
gtk_widget_set_size_request(minus, 80, 35);
gtk_fixed_put(GTK_FIXED(frame), minus, 50, 80);
label = gtk_label_new("0");
gtk_fixed_put(GTK_FIXED(frame), label, 190, 58);
gtk_widget_show_all(window);
//连接回调函数
g_signal_connect(window, "destroy",
G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect(plus, "clicked",
G_CALLBACK(increase), label);
g_signal_connect(minus, "clicked",
G_CALLBACK(decrease), label);
gtk_main();
return 0;
}
一些简单的补充和说明
关于信号的连接,还是举一个例子
例如
g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL);
四个参数分别对应了,1发出信号的窗体,2信号或事件的类型,3回调函数的名称,4传入数据
这里在顺带说明下,与g_signal_connect相对应的回调函数的传入参数是gpointer型的,也就是一个空指针型,这就意味着我们可以传入几乎任意形态的数据,可以是字符,也可以是窗体!
而与其对应回调函数应类似如下的声明
gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
……………
}
如果是普通的信号,则省略中间的那一项!
另外前面的程序中还涉及到了另一个信号连接函数,这里也作简要的说明,当然还是举例来说
g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);
可以看到几乎与前面的那种相同,但最后的那个window其实并不是传入的窗体【这样说不一定科学】
它所表示的意思是click由button发出,但到了回调函数中,回调函数则认为发出者是window,暗中进行了交换!
如果回调函数的意图是自身窗体的销毁,那么此时销毁的就是window而不是button了!
另外,由于其并不显示的传入指定的数据,其回调函数的参数中只有一项就够了
void callback_func( GtkObject *object )
{
………………………
}