GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建

一、简介

        虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的。如下是在Windows10下配置GTK+的开发环境。
        Gnome的开发基础结构是围绕一组函数库的,所有的内容都是用可移植的ANSI C语言写成的,可以用于所有类UNIX系统,与图形相关的函数库依赖于X Window系统。 Gnome函数库是最高层的。GTK+由两部分组成,GTK和GDK。 GTK层为C语言提供了一个对象模型,并为UI工具包提供了最基本的widget,它是上层GUI派生的基础。 GTK是依赖于GDK的,GDK是Xlib的一个底层包装,Xlib库直接与X服务器对话。 除了Xlib以外的任何部分都是基于GLib的,它是一个有用的C函数库,提供了很多实用程序和可移植的功能以及一组容易被C语言使用的容器。 
       一个Gnome程序使用多个库组成的层次结构: Gnome库在最高层,包括帮助例程,类和特殊的widget,并为应用程序提供一个基础架构。第二层是GTK,它是GTK+库的一部分。这个库提供了基本的工具包和widget来创建GUI应用程序。大多数GUI是直接用GTK编写的。GTK同时为Gnome库提供了一个功能强大的对象系统。 再下一层是GDK,它简单的对X函数库进行了包装,只有在我们进行特殊绘画或设置窗口的特殊属性的时候才会用到它.  最下面一层是Glib,它是C的一个实用程序库,包括可移植性和一些实用程序功能,以及一些容器类,例如:链表,可变数组,变长字符串,HASH(貌似是哈西表),缓存,一个事件循环和其他有用的结构。


二、详解

1、下载GTK+ 3.x

(1)进入GTK+的官方网站http://www.gtk.org/,点击Download,选择相应的版本进入。

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建_第1张图片

(2)若要下载、解压、整理那些单独的文件,则不是很方便,所以就可以选择有”All-in-one bundles” 的链接,点击下载。


         解压完成,复制到/etc/gtk(也可以自定义其他目录),可以看到一些目录文件夹,主要包括:bin、etc、include、lib、man、manifest、share、src。其中bin目录下主要包含一些可执行文件和动态链接库,lib目录主要包含一些库文件、include主要包含的是一些头文件。

       注:最近可在windows下安装MSYS2(Minimal SYStem 2),它是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境,同时它也是一个在Cygwin (POSIX 兼容性层) 和 MinGW-w64(从"MinGW-生成")基础上产生的,追求更好的互操作性的 Windows 软件。它集成了pacman和Mingw-w64的Cygwin升级版, 提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64 工具链。与MSYS最大的区别是移植了 Arch Linux的软件包管理系统 Pacman(其实是与Cygwin的区别)。参考:https://msys2.github.io/ 。

2、配置GTK

在/etc/gtk目录下有一个帮助文件:

This is a bundle containing the GTK+ stack and its dependencies
for Windows. As such it is nothing more than a combination of the
individual packages it consists of. Here is a shortened list :
- GTK+ 3.6.4 (patched) ;
- GLib 2.34.3 ;
- GDK-Pixbuf 2.26.5 ;
- Pixman 0.26.0 ;
- Cairo 1.10.2 (patched) ;
- Pango 1.30.1 ;
- ATK 2.6.0.

Both run-time and developer packages are included.

This bundle is intended for software developers and packagers. You are
expected to know what to do with it, more or less.

To use it, create some empty folder like "c:\gtk", Using either
Windows Explorer's built-in zip file management, or the command-line
unzip.exe, available for instance at
ftp://tug.ctan.org/tex-archive/tools/zip/info-zip/WIN32/unz552xN.exe
unzip this bundle. Avoid Winzip! It is known to behave oddly.

(But you presumably already did extract the files, as you are reading
this file.)

Then add the bin folder to your PATH. Make sure you have no other
versions of GTK+ in PATH. Run:
    pkg-config --cflags gtk+-3.0
and verify that it prints out something reasonable. Prepare Pango :
    pango-querymodules > c:\gtk\etc\pango\pango.modules
Prepare GDK-Pixbuf :
    gdk-pixbuf-query-loaders > c:\gtk\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache
Prepare GTK+-IMModules :
    gtk-query-immodules-3.0 > c:\gtk\lib\gtk-3.0\3.0.0\immodules.cache
Run:
    gtk3-demo
and verify that it works.
(1)配置环境变量
      右键开始菜单--选择控制面板,切换到小图标或大图标模式选择“系统”,点击“高级系统设置”,选择“环境变量”,将”C:\gtk\bin”加入到环境变量”Path”中。bin目录中包含有运行时所需的dll文件,其中也包括gtk-demo.exe示例程序。

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建_第2张图片

(2)然后按照帮助文档执行pango-querymodules、gdk-pixbuf-query-loaders、gtk-query-immodules-3.0,接着运行GTK+的例子:

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建_第3张图片

3、设置QtCreator环境

(1)首先安装好QtCreator(具体参考网上教程)。
(2)新建空的QT项目,并添加cpp文件main.cpp

#include <gtk/gtk.h>
 int main (int argc, char *argv[])
 {
    GtkWidget *window;
    GtkWidget *label;
    //初始化GTK+库
    gtk_init(&argc, &argv);
    //创建主窗口
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //设置窗口大小    
    gtk_widget_set_size_request(window,300,300);
    //设置标题
    gtk_window_set_title(GTK_WINDOW (window), "Hello World");
    //当窗口即将被销毁,停止主GTK+循环
    g_signal_connect(window, "destroy",G_CALLBACK (gtk_main_quit), NULL);
    //创建一个"Hello World"标签
    label = gtk_label_new("Hello, World");
    //将标签加入到主窗口
    gtk_container_add(GTK_CONTAINER (window), label);
    //设置窗口中的所有元素可见
    gtk_widget_show_all(window);
     //开始主循环,让它在那里休息,直到应用程序关闭
    gtk_main();
    return 0;
}
(3)添加GTK的头文件和库(pro文件)
      在cmd中执行命令pkg-config --cflags gtk+-3.0添加到INCLUDEPATH中,执行命令pkg-config --cflags --libs gtk+-3.0添加到LIBS中。当然也可以使用更简单的方式:在pro文件中添加:
CONFIG += link_pkgconfig
PKGCONFIG += gtk+-3.0
最后的pro文件是:
#-------------------------------------------------
#
# Project created by QtCreator 2015-08-30T02:36:02
#
#-------------------------------------------------
TARGET = helloworld
TEMPLATE = app
CONFIG += link_pkgconfig
PKGCONFIG += gtk+-3.0
#INCLUDEPATH += C:/gtk/include/gtk-3.0 C:/gtk/include/cairo C:/gtk/include/pango-1.0 \
#               C:/gtk/include/atk-1.0 C:/gtk/include/cairo C:/gtk/include/pixman-1  \
#               C:/gtk/include C:/gtk/include/freetype2 C:/gtk/include C:/gtk/include/libpng15 \
#               C:/gtk/include/gdk-pixbuf-2.0 C:/gtk/include/libpng15 C:/gtk/include/glib-2.0   \
#               C:/gtk/lib/glib-2.0/include

#LIBS += -LC:/gtk/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lpangocairo-1.0 \
#        -lpangoft2-1.0 -lfreetype -lfontconfig -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lm -latk-1.0  \
#        -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl
SOURCES += main.cpp
HEADERS  +=
main.cpp的代码:
#include <gtk/gtk.h>
 
 int main (int argc, char *argv[])
 {
    GtkWidget *window;
    GtkWidget *label;
    //初始化GTK+库
    gtk_init(&argc, &argv);
    //创建主窗口
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //设置窗口大小    
    gtk_widget_set_size_request(window,300,300);
    //设置标题
    gtk_window_set_title(GTK_WINDOW (window), "Hello World");
    //当窗口即将被销毁,停止主GTK+循环
    g_signal_connect(window, "destroy",G_CALLBACK (gtk_main_quit), NULL);
    //创建一个"Hello World"标签
    label = gtk_label_new("Hello, World");
    //将标签加入到主窗口
    gtk_container_add(GTK_CONTAINER (window), label);
    //设置窗口中的所有元素可见
    gtk_widget_show_all(window);
     //开始主循环,让它在那里休息,直到应用程序关闭
    gtk_main();
    return 0;
}

4、运行

      有时会出现启动错误:“无法定位程序输入点gzdirect于动态链接库zlib1.dll。原因是:安装某些软件在安装时,会将zlib1.dll放入C:\Windows\System32文件夹中,就使目录中存在旧版本的zlib1.dll,虽然GTK+安装目录下的bin文件中自带zlib1.dll,但是会优先在System32文件夹中找dll文件,而这个旧版本的zlib1.dll就导致GTK+启动出错。
        解决方法:(1)将C:\Windows\System32中的zlib1.dll重命名zlib1.dll.off或zlib1.dll.old等任意名字,或者直接删除,再启动GTK+就能正常打开了。但这种方法有可能导致其他程序不能正常启动。(2)C:\gtk\bin文件夹中的zlib1.dll复制到C:\Windows\System32中,再启动GTK+就能正常打开了。新版本的zlib也可以保证以前程序的正常启动。
运行结果图:

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建_第4张图片

三、总结

(1) 3.6.5及其最新的版本可以在网上找到http://developer.gnome.org/gtk3/。如果您正在寻找旧的GTK + 2系列磁带库,请参阅http://developer.gnome.org/gtk2/
(2)若有建议,请留言,在此先感谢!

你可能感兴趣的:(gtk)