【C语言】Ubuntu 22上用GTK写GUI程序

发布时间:2024年01月02日

一、GTK介绍

GTK (GIMP Toolkit) 是一个多平台的图形用户界面工具包。它最初是为图像处理程序 GIMP 开发的,后来演变成为许多操作系统上开发图形界面应用程序的通用库。GTK 是用C语言编写的,并且是自由和开源软件,遵循LGPL (GNU Lesser General Public License) 许可证。
桌面环境(如 GNOME、XFCE、LXDE)使用GTK作为其基本的图形界面库来构建其用户界面。这些桌面环境提供了完整的桌面系统体验,包括窗口管理、系统菜单、面板、工具栏和其他基础设施,GTK则是使得这些组件拥有统一和美观风格的基石。

二、Ubuntu 22上用GTK写GUI程序

要使用GTK开发图形用户界面(GUI)程序,首先需要安装GTK库。

1. 确保GTK库已安装。

在Ubuntu系统上,可以使用以下命令安装GTK的开发文件:

sudo apt install libgtk-4-dev
sudo apt install libgtk-3-dev

2. 创建一个C文件(例如:`hello.c`)

添加以下代码,这个示例程序将创建一个带有按钮的窗口,单击按钮会在终端中打印"Hello World"。

#include <gtk/gtk.h>

static void print_hello(GtkWidget *widget, gpointer data) {
  g_print("Hello World\n");
}

static void activate(GtkApplication *app, gpointer user_data) {
  GtkWidget *window;
  GtkWidget *button;

  // 创建一个窗口
  window = gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window), "Window");
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

  // 创建一个按钮,绑定点击事件
  button = gtk_button_new_with_label("Hello World");
  g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);
  gtk_window_set_child(GTK_WINDOW(window), button);

  // 显示窗口和按钮
  gtk_widget_show(window);
}

int main(int argc, char **argv) {
  GtkApplication *app;
  int status;

  // 创建一个GtkApplication实例
  app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);

  return status;
}

3. 编译这个程序。

可以使用`gcc`编译器进行编译,并且链接GTK库:

gcc `pkg-config --cflags gtk4` -o hello hello.c `pkg-config --libs gtk4`

命令中的?pkg-config?用于自动查找GTK库的编译和链接标志。这里的`gtk4`表示我们使用的是GTK 4,如果需要使用GTK 3,则将`gtk4`替换为`gtk+-3.0`。

4. 运行编译后的程序:

./hello

这个程序是使用GTK的C API编写的。

GTK也有许多语言绑定供不同语言使用,例如Python,C++,Rust等,所以也可以用这些语言和相应的GTK绑定来开发GUI程序。

对于其他语言的示例和详细说明,可以查阅GTK的官方文档或找到相应的语言绑定教程。

5. GTK官网

The GTK Project - A free and open-source cross-platform widget toolkit

文章来源:https://blog.csdn.net/eidolon_foot/article/details/135330336
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。