树莓派玩转树莓派智能制造与树莓派

[MagPi 89期] 基于GTK工具包自定义Linux GUI

2020-04-07  本文已影响0人  启莘风

文章信息

本文翻译自The MagPi 89期(2020年01月刊)- Tutorial

原文标题: Custom widgets with C and GTK

原文作者: Simon Long — 软件工程师,受雇于树莓派公司,负责Raspbian和Debian环境的树莓派桌面开发

翻译: 启莘风

点击文章末端“阅读原文”可获取原文(若无法跳转可用浏览器打开)。

欢迎各大论坛网站转载分享。

转载请注明原文作者及中文译文出处,并以原文超链接或二维码形式注明中文译文出处:启莘风。


The MagPi杂志简介与译者注

MagPi是面向创客的终极杂志,它包含以Raspberry Pi为主题的创新项目、评论、教程、操作方法以及新闻和活动。

2012年,MagPi作为树莓派社区的杂志,由爱好者发行。现在由Raspberry Pi官方认可并发行,每月一刊。现已成为市场上最畅销的计算机杂志之一。对于任何对技术有浓厚兴趣的人来说,这都是不错的选择。

网络上不乏众多爱好者对多期MagPi杂志进行了汉化,但因为各种原因,大多都已暂停或停止了更新。本公众号启莘风将从2020年1月刊(第89期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。

image

GTK工具包函数功能示例

“更改小部件的属性,以更改其外观。”

到目前为止,在树莓派所有示例中,我们都使用默认状态的小部件。我们通过调用 gtk_<widget name>_newfunction建了小部件并使用了它。但是,GTK确实通过设置每个小部件的属性来允许一定程度的小部件的自定义。

作为示例,我们将看一下基本GtkButton小部件的一些属性。试试这个例子:

void main (int argc, char *argv[])
{
gtk_init (&argc,  &argv);
GtkWidget  *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
GtkWidget  *btn = gtk_button_new_with_label ("Close window");
g_signal_connect (btn,  "clicked", G_CALLBACK (end_program), NULL);
g_signal_connect (win,  "delete_event", G_CALLBACK (end_program), NULL);
GtkWidget  *btn2 = gtk_button_new_with_label ("My button");
g_object_set (G_OBJECT (btn2),"relief",GTK_RELIEF_NONE, NULL);  # highlighted line
GtkWidget  *box = gtk_vbox_new (FALSE,  5);
gtk_box_pack_start (GTK_BOX (box), btn2,TRUE, TRUE,  0);
gtk_box_pack_start (GTK_BOX (box), btn,TRUE, TRUE,  0);
gtk_container_add (GTK_CONTAINER (win),box);
gtk_widget_show_all (win);
gtk_main ();
}

这是先前示例中熟悉的代码,但是高亮的行是新的。

g_object_set将小部件的名称作为参数,然后是以 NULL终止的属性名称和属性值列表。在这种情况下,我们将GtkButton btn2的浮雕属性(relief property)设置为 TK_RELIEF_NONE(参见图1)。

图1 一个GtkButton,其浮雕属性设置为 `GTK_RELIEF_NONE`

GtkButton的“浮雕”属性控制边框的外观。一些GTK小部件的边框周围应用了一定程度的阴影以提供3D外观。在默认情况下,GtkButton启用了此阴影,这使按钮看起来与窗口背景略有不同。通过将浮雕设置为 GTK_RELIEF_NONE,该3D阴影将被删除。如果您运行上述程序,则应该能够清楚地看到窗口上两个按钮之间的区别。(您可以使用TAB键在按钮之间移动虚线轮廓以更清楚地显示差异。)

下面是另一个例子。删除浮雕属性的设置,并通过添加下划线更改按钮的名称:

GtkWidget *btn2 = gtk_button_new_with_label ("My_button");

您应该最终得到一个类似于图2的按钮。

图2 一个GtkButton,在标签中带有下划线,并且 `use-underline`属性设置为 `FALSE`

如果现在设置 use-underline(设置下划线)属性:

g_object_set (G_OBJECT (btn2),"use-underline", TRUE, NULL);

下划线将消失,但是如果您按住键盘上的ALT键,则下划线会再次出现在“按钮”的“ b”下方(图3)。

图3 相同的GtkButton,但 `use-underline`设置为 `TRUE`

所有小部件都具有可以像这样设置的属性。再举一个例子,尝试用GtkLabel替换GtkButton:

GtkWidget *lbl = gtk_label_new ("My label");

然后将标签的角度属性(angle property)设置为45度:

g_object_set (G_OBJECT (lbl), "angle", 45.0, NULL);

请注意,将角度输入为45.0而不是仅输入45是很重要的。因为期望的值是浮点数,在值的末尾添加“.0”,可确保编译器将输入值其视为浮点数。

程序运行完毕后,应该弹出一个如图4所示这样的窗口,标签文本与水平方向成45度角(图4)。

图4 一个GtkLabel,其角度属性设置为45.0

在许多情况下,小部件还具有专用的功能来设置每个属性,以代替通用的 g_object_setfunction函数(在上面的示例中,分别为 gtk_button_set_reliefgtk_button_set_use_underlinegtk_label_set_angle)。g_object_set的优点在于,它可以用于在一行中设置多个属性,这可以大大缩短您的代码。

每个窗口小部件的GTK在线文档页面列出了所有属性和专用函数以设置其值。对于上面的两个示例,可以在magpi.cc/GtkButton和magpi.cc/GtkLabel上找到。值得一看的是您要使用的任何小部件的选项。这些页面也是找出与小部件交互时,小部件产生什么信号的好方法。

GTK工具包主题使用简介

可以自定义GTK小部件的另一种方式是使用主题。主题会影响每个GTK应用程序中小部件的每个实例的外观,而不是一次更改单个小部件的外观。

在Raspbian(以及大多数其他Linux桌面发行版)中,在目录 /usr/share/themes中安装了一系列主题。

该目录包含许多命名文件夹,每个文件夹都是GTK或其他主题应用程序的主题。如果命名文件夹包含名为“gtk-2.0”的子文件夹,则该文件夹的名称也是有效的GTK 2主题名称。

GTK应用程序当前使用哪个主题通常由xsettings daemon守护进程控制,该进程在后台运行,并向所有桌面应用程序提供配置信息。在Raspbian上,要更改在守护进程中设置的主题,您需要更改配置文件中的值。

为此,请检查目录 ~/.config/lxsession/LXDE-pi中是否存在名为desktop.conf的文件。如果没有,请通过将文件 /etc/xdg/lxsession/LXDE-pi/desktop.conf复制到该目录中来创建一个。

然后,如果您使用文本编辑器查看desktop.conf文件,则会出现标题为[GTK]的部分。在该标题下的某处是以 sNet/ThemeName=开头的行,默认情况下,在Raspbian上该行设置为PiX。如果您在此行中将PiX更改为另一个GTK +2主题的名称( /usr/share/themes中的包含了gtk-2.0子目录的任何目录),则正在使用的主题将自动更新,并且您应该能看到每个GTK应用程序正在以新主题重新运行。

创建主题不适合缺少经验的开发者,但是如果您有兴趣,可以在目录 /usr/share/themes中的任一gtk-2.0子文件夹查看。主题本身位于此文件夹中的名为gtkrc的文件中。可能还有许多其他子文件夹,其中包含该主题使用的图形元素和其他资源。

gtkrc文件是纯文本文档,可以在您选择的编辑器中打开。其中大多数包含许多样式定义,其中包括文字样式和大括号中包含的几行。文件的末尾是将小部件与先前定义的样式相关联的行。

要更改小部件的外观,请在文件末尾的关联列表中找到它,并注意对其应用的样式。然后在文件中找到该样式的定义,然后尝试更改一些参数以查看会发生什么。在执行此操作之前,请备份原始的gtkrc文件,或更好的备份方法是,复制整个主题文件夹,并为其选择一个新名称。将desktop.conf中的 ThemeName设置为新主题的名称,然后通过修改现有主题创建自己的主题!


本公众号启莘风将从2020年1月刊(第89期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。


上一篇 下一篇

猜你喜欢

热点阅读