时间:2022-8-1来源:本站原创作者:佚名

C语言GUI编程(GTK),各平台GUI方案、安装GTK、编写第一个GTK程序、为GTK应用配置主题、使用XML完成布局、使用Glade完成布局、使用CSS调整控件样式、打包发布GTK程序、GTK的面向对象设计理念、GTK的内存管理。

01

GUI开发概述各平台GUI方案

很多同学学习编程语言都希望完成一些作品,我也不例外,大一学习C语言时看腻了控制台“黑窗口”。而图形界面是学习编程初期最容易让人产生成就感的。

GUI,GraphicalUserInterface。不同平台的图形界面都有自己的API。

不管出于什么原因,每个平台都有自己的一套方案,甚至是设计理念。各类平台通常给研发带来痛苦,因为总是需要维护几套相同逻辑的代码。而割裂的GUI设计理念则让GUI应用开发者头疼。于是涌现出了一些跨平台的方案,如前端中的Electron、C++中大名鼎鼎的QT、Google的亲儿子Flutter.

本文将会让大家了解更高级的C语言的数据和函数的组织方式。如果仅仅是为了实现一个GUI应用,可以选择Electron、QT。

在项目的技术选型上,用C语言开发跨平台的应用通常不是最好的选择,不过由于C语言本身就和现在广大编程语言不同,它的使用场景主要在底层硬件交互上,因此使用C语言开发GUI的场景本身就很少。

但也有例外,Linux的核心代码是C语言编写而成的,系统的API也是C语言的API,Linux是C坚定的支持者。

现在GTK已经被移植到Windows、Linux、macOS中,因此现在可以用GTK开发跨平台的GUI应用。

GTK使用C语言开发,也恰恰为其他语言调用GTK提供了便利,只要加一个中间层,就可以轻松地将GTK应用于其他语言的开发中。

注:本文基于GTK+v3这个版本进行介绍GUI程序的开发思路。想了解更多请参考GTK的文档。

02

安装GTK安装遇到的各种问题

如果使用的是Ubuntu20.x,系统自带GTK3.0,无需安装。

如果使用的是Mac,只需要brewinstallgtk+3

如果使用的是windows,可以选择自己编译或MSYS2安装,自己编译太麻烦了,本文通过MSYS2演示,请看接下来的安装操作:

此时msvc就不好使了,转而用mingw来开发。

注:msys2可以参考文末推荐阅读安装配置

查找下gtk,安装包和运行环境使用的是2个运行环境窗口。

安装icon:

安装图形界面的编辑工具glade:

linux安装glade:aptinstallglade

03

编写第一个GTK程序

IDE:Clion+CMake+MinGW

注:全部源码请参考我的Github,本文只给出关键代码。

CMake配置寻找gtk:

FIND_PACKAGE(PkgConfigREQUIRED)PKG_CHECK_MODULES(GTK3REQUIREDgtk+-3.0)INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS})LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS})ADD_DEFINITIONS(${GTK3_CFLAGS_OTHER})target_link_libraries(${name}${GTK3_LIBRARIES})

#includestdio.h#includegtk/gtk.hstaticvoidprint_hello(GtkWidget*widget,gpointerdata){g_print("HelloWorld\n");}staticvoidactivate(GtkApplication*app,gpointeruser_data){GtkWidget*window=gtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window),"YinLei");gtk_window_set_default_size(GTK_WINDOW(window),,);GtkButtonBox*button_box=gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);gtk_container_add(GTK_CONTAINER(window),button_box);GtkButton*button=gtk_button_new_with_label("HelloWorld");gtk_container_add(GTK_CONTAINER(button_box),button);g_signal_connect(button,"clicked",G_CALLBACK(print_hello),NULL);g_signal_connect_swapped(button,"clicked",G_CALLBACK(gtk_window_close),window);gtk_widget_show_all(window);}intmain(intargc,char**argv){GtkApplication*app=gtk_application_new("
转载请注明原文网址:http://www.gzdatangtv.com/cksc/cksc/17347.html

------分隔线----------------------------