GTK编程

来自百合仙子's Wiki
跳转到导航 跳转到搜索

编译

gcc gtkhello.c -o gtkhello $(pkg-config --cflags --libs gtk+-2.0)

示例

#include<gtk/gtk.h>
void hello(GtkWidget *widget,gpointer data)
{
	g_print("Hello Ubuntu!\n");
}
gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
	g_print ("delete event occurred\n");
	return(TRUE);
}
void destroy(GtkWidget *widget,gpointer data)
{
	gtk_main_quit();
}
int main( int argc, char *argv[] )
{
	GtkWidget *window;
	GtkWidget *button;
	gtk_init (&argc, &argv);
	window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
	gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
	gtk_container_set_border_width (GTK_CONTAINER (window), 10);
	button = gtk_button_new_with_label ("Hello Ubuntu!");
	gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
	gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));
	gtk_container_add (GTK_CONTAINER (window), button);
	gtk_widget_show (button);
	gtk_widget_show (window);   /*显示一个窗口*/
	gtk_main();   /*进入主循环*/
	return(0);
}

会显示一个带有一个按钮的窗口,点击按钮以后窗口关闭,命令行显示Hello Ubuntu! 来源:Gtk与Qt编译环境安装与配置 - Ubuntu中文

修改背景色

GdkColor color;
color.red = 0xffff;
color.green = 0xd7d7;
color.blue = 0xffff;
gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &color);

获取配置信息

以下代码 GTK2 和 GTK3 兼容。[1][2]

#include<gtk/gtk.h>

GtkSettings *s;
void get_value(const gchar* prop){
  gchar *str;
  g_object_get(s, prop, &str, NULL);
  g_printf("%s: %s\n", prop, str);
}
int main(int argc, char **argv){
  gtk_init(&argc, &argv);
  s = gtk_settings_get_default();
  get_value("gtk-theme-name");
  get_value("gtk-icon-theme-name");
  return 0;
}

窗口位置改变事件

void pos_changed(GtkWindow *kbd_win, GdkEvent *event, gpointer data){
  int x, y;
  x = event->configure.x;
  y = event->configure.y;
  printf("%d, %d\n", x, y);
}

gtk_widget_add_events(GTK_WIDGET(kbd_win), GDK_CONFIGURE);
g_signal_connect(G_OBJECT(kbd_win), "configure-event",
      G_CALLBACK(pos_changed), NULL);

来源:GTK+ 中的事件(events)和信号(signals)

窗口和显示

改变窗口所在的 X server

使用 gtk_window_set_screen 函数可改变窗口所在的 DISPLAY。示例代码如下(未作出错处理):

GdkDisplay *dpy = gdk_display_open(":1");
GdkScreen  *scr = gdk_display_get_screen(dpy, 0);
gtk_window_set_screen(GTK_WINDOW(window), scr);

Windows 操作系统

Windows 系统上,使用 MinGW 链接时如果不加 -mwindows 选项,则编译出来的程序会开启一个终端窗口。如使用Visual C则要将主函数改成 WinMain[3]这样终端的输出将消失。

GDK

使用外部窗口

Gdk 可以根据 XID 引用其它程序的窗口。[4] GDK 2 的 API gdk_window_foreign_new 是过时的,GDK 3 使用 gdk_x11_foreign_new_for_display ,它在 GObject Introspection 中位于 GdkX11 中。[5]

#!/usr/bin/env python3
from gi.repository import Gdk
from gi.repository import GdkX11

Gdk.Window.process_all_updates()
xlib_window = 0x2a00005 # from xwininfo command
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window)
print(gdk_window.get_geometry())

参见

外部链接

参考资料