文章信息
本文翻译自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期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。
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)。
GtkButton的“浮雕”属性控制边框的外观。一些GTK小部件的边框周围应用了一定程度的阴影以提供3D外观。在默认情况下,GtkButton启用了此阴影,这使按钮看起来与窗口背景略有不同。通过将浮雕设置为 GTK_RELIEF_NONE
,该3D阴影将被删除。如果您运行上述程序,则应该能够清楚地看到窗口上两个按钮之间的区别。(您可以使用TAB键在按钮之间移动虚线轮廓以更清楚地显示差异。)
下面是另一个例子。删除浮雕属性的设置,并通过添加下划线更改按钮的名称:
GtkWidget *btn2 = gtk_button_new_with_label ("My_button");
您应该最终得到一个类似于图2的按钮。
如果现在设置 use-underline
(设置下划线)属性:
g_object_set (G_OBJECT (btn2),"use-underline", TRUE, NULL);
下划线将消失,但是如果您按住键盘上的ALT键,则下划线会再次出现在“按钮”的“ b”下方(图3)。
所有小部件都具有可以像这样设置的属性。再举一个例子,尝试用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)。
在许多情况下,小部件还具有专用的功能来设置每个属性,以代替通用的 g_object_setfunction
函数(在上面的示例中,分别为 gtk_button_set_relief
, gtk_button_set_use_underline
和 gtk_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期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。