首页 > 其他分享 >GTK 学习笔记

GTK 学习笔记

时间:2023-01-09 23:37:10浏览次数:58  
标签:main gtk 1.0 GTK 笔记 学习 2.0 usr include

初创建于: 2022-08-13 17:57

GTK NOTES

Generate compile_commands.json

在编写 gtk 程序时, 需要使用到:

#include <gtk/gtk.h>
/// ...

但实际上, 这个库的路径是 /usr/include/gtk-4.0/gtk/gtk.h, 因此需要在 compile_commands.json 中设置includePath.

为了生成 compile_commands.json, 需要使用 cmake 构建项目.

创建 cmake 项目结构

假设项目名为helloWorld, 则应有如下的目录结构:

image-20220813190132082

其中 COPYRIGH, READMEdoc/helloWorld.txt是非必需的, src/main.cpp是项目的主要源文件.

编写 CMakeLists.txt

首先编辑项目根目录下的CMakeLists.txt:

PROJECT(HELLOWORLD) # 项目名称
ADD_SUBDIRECTORY(src bin) # 指定两个子文件夹, src 是源代码目录, bin 是生成的二进制文件所在目录
SET(CMAKE_INSTALL_PREFIX /home/corona/Downloads/projects/) # 更改安装路径
INSTALL(FILES COPYRIGHT README DESTINATION doc/helloWorld/) # 指定文件安装路径
INSTALL(DIRECTORY doc/ DESTINATION doc/helloWorld/) # 将 doc/ 目录下的所有文件安装到指定路径

然后编辑src/CMakeLists.txt:

SET (SRC_LIST main.cpp)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 指定生成的二进制文件路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
ADD_EXECUTABLE (hello ${SRC_LIST}) # hello 是生成的可执行文件名, SRC_LIST 是其依赖

指定 includePath 与添加链接参数

首先, 使用 pkg-config --cflags gtk4 命令获取需要添加的路径与链接参数:

image-20220813191408477

src/CMakeLists.txt中添加如下内容:

INCLUDE_DIRECTORIES(
	/usr/include/gtk-4.0
	/usr/include/pango-1.0
	/usr/include/glib-2.0
	/usr/lib64/glib-2.0/include
	/usr/include/sysprof-4
	/usr/include/harfbuzz
	/usr/include/freetype2
	/usr/include/libpng16
	/usr/include/libmount
	/usr/include/blkid
	/usr/include/fribidi
	/usr/include/libxml2
	/usr/include/cairo
	/usr/include/pixman-1
	/usr/include/gdk-pixbuf-2.0
	/usr/include/graphene-1.0
	/usr/lib64/graphene-1.0/include
	/usr/include/gio-unix-2.0
)
ADD_EXECUTABLE(main ${SRC_LIST})
# TARGET_LINK_LIBRARIES 需要在 ADD_EXECUTABLE 之后
TARGET_LINK_LIBRARIES(main
	pthread
	gtk-4
	pangocairo-1.0
	pango-1.0
	harfbuzz
	gdk_pixbuf-2.0
	cairo-gobject
	cairo
	graphene-1.0
	gio-2.0
	gobject-2.0
	glib-2.0
)

生成 compile_commands.json

cd build/
rm -rf *
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..

然后在build/目录下就能找到 compile_commands.json文件了

[
    {
      "directory": "/home/corona/Documents/projects/gtk-learning/build/bin",
      "command": "/usr/bin/cc  -I/usr/include/gtk-4.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/libxml2 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/graphene-1.0 -I/usr/lib64/graphene-1.0/include -I/usr/include/gio-unix-2.0  -o CMakeFiles/main.dir/main.o -c /home/corona/Documents/projects/gtk-learning/src/main.c",
      "file": "/home/corona/Documents/projects/gtk-learning/src/main.c"
    }
]

只需要这个文件就可以使coc能够正确地显示补全, 因此之后可以手动创建该文件, 将文件中的路径与文件名更改一下即可(不改也行, 因为只是用来让 coc.nvim 正确地显示补全的).

以上命令同时生成了 Makefile 文件, 如果需要的话, 可以直接在 build/ 目录下执行 make install 等命令构建项目.


Getting Started

创建一个空的窗口

#include <gtk/gtk.h>

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

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  gtk_widget_show (window);
}

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

  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;
}

如果不使用 cmake, 也可以直接使用以下命令编译运行:

gcc $( pkg-config --cflags gtk4 ) -o main main.c $( pkg-config --libs gtk4 )

运行程序, 可以看到弹出了一个空白窗口:

image-20220813205050250

在 GTK 程序中, main 函数中需要创建一个GtkApplication类型的变量, 以上代码声明了GtkApplication类型的指针app并用gtk_application_new这一函数来初始化它. 其中参数 org.gnome.example 是其唯一标识

References

标签:main,gtk,1.0,GTK,笔记,学习,2.0,usr,include
From: https://www.cnblogs.com/Corona09/p/17038867.html

相关文章

  • Linux入门笔记
    Linux命令command[-options][parameter]options可选选项,控制命令的行为细节parameter可选参数,控制命令的指向目标ls命令ls[-a-l-h][Linux路径]在命令行中,以......
  • SpringBoot笔记--自动配置(高级内容)(上集)
    原理分析自动配置Condition--增加的条件判断功能来一个案例说明:具体实现:没有要求的话,就是这样的:Config.javaUser.javaSpringLearnApplication.java结果:加上......
  • 大二上假期学习——Day02
    一、XML约束1.作用:约束xml文档的写法;对xml进行校验。2.分类1)DTD1.注意:默认DTD约束在浏览器中是关闭的,可以另外写一个html执行JavaScript脚本开启约束验证。2.DTD语......
  • 计算机网络名词学习
    就在刚刚过去的这个周末,UEFI论坛正式发布了UEFISpec2.10规范[1]和ACPISpec6.5[2]。在这两个重量级更新中,比较引人注目的是龙芯CPU的LoongArch架构正式进入UEFI和ACPI规......
  • JavaScript学习笔记—常量、标志符
    1.常量使用const声明常量,常量只能赋值一次,重复赋值会报错除了常规的常量外(如PI),有一些对象类型的数据也会生命为常量constPI=3.1415926;console.log(PI);//3.14......
  • Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
    全文链接:http://tecdat.cn/?p=31201原文出处:拓端数据部落公众号摘要:此报告首先将dataset进行数据清洗,得到dataset_new。再将dataset_new中属性分为基本信息、贷款行为/......
  • GPU笔记
    图形流水线内存里面专门开了一块空间用来存储即将显示到显示器上的【像素】们。用你家显示器分辨率乘积的结果就可以算出你家的显示器可以显示多少个像素。每个像素用RGB2......
  • Guava学习笔记:Guava新增集合类型-Bimap
    @TestpublicvoidBimapTest(){BiMap<Integer,String>logfileMap=HashBiMap.create();logfileMap.put(1,"a.log");logfileMap.pu......
  • Springcloud源码学习笔记1—— Zuul网关原理
    系列文章目录和关于我源码基于spring-cloud-netflix-zuul-2.2.6.RELEASE.jar需要具备SpringMVC源码功底推荐学习https://www.cnblogs.com/cuzzz/p/16538064.html零丶......
  • 学习笔记——Mybatis映射文件根标签与子标签
    2023-01-09一、Mybatis映射文件1、映射文件根标签mapping标签:该标签中的namespace要求与接口的全类名一致2、映射文件子标签(1)cache(该命名空间的缓冲配置)(2)cache-ref(......