Gtk(和 Gtkmm)为此目的使用 CSS。我在下面解释的是设置您的程序以使用外部 CSS 文件,而不是与在 .cpp 文件中对其进行编码相关的现有答案。
准备自定义 CSS
您首先需要创建一个CssProvider、一个Style Context和一个Screen。
在运行程序之前,这三个对象需要在主循环中。
// Create CssProvider
Glib::RefPtr<Gtk::CssProvider> cssProvider = Gtk::CssProvider::create();
cssProvider->load_from_path("relative or absolute path to YourTheme.css");
// Create StyleContext
Glib::RefPtr<Gtk::StyleContext> styleContext = Gtk::StyleContext::create();
//get default screen
Glib::RefPtr<Gdk::Screen> screen = Gdk::Screen::get_default();
//add provider for screen in all application
styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
使用 CSS
因为文档低于 Gtkmm,所以使用 Gtk+ 文档更容易找到小部件的“类”或“样式”名称。或者,您可以找到现有主题并打开它们的 CSS 文件以查找名称('/usr/share/themes/')。
Gtk/mm 遵循与普通 CSS 类似的选择器。
以下是您可以在此处找到的完整列表的摘录(尽管被标记为 GTK+,但它适用于所有包装器,包括 Gtkmm)。
*
任何节点。
E
任何名称为“E”的节点。
E.class
具有给定样式类的任何 E 节点。
E#id#
具有给定 ID 的任何 E 节点。(GTK 使用小部件名称作为 ID)。
E:nth-child
任何 E 节点,它是其父节点的第 n 个子节点。
E:active, E:hover, E:focus
作为具有相应状态的小部件的一部分的任何 E 节点。
E>F
作为 E 节点的子节点的任何 F 节点。
例子:
以下是我用于我自己的一个程序的 CSS 的示例摘录。
.background{
background-color: @shade0;
color: @mainTextColour;
}
#EngineTabSidePanel > GtkGrid{
background-color: @shade1;
}
/* BUTTONS:*/
.button{
border: none;
border-radius: 0;
background-color: @shade1;
color: rgb(175, 175, 175);
}
.button:insensitive{
background-color: @shade0;
color: rgb(150, 150, 150);
}
.button:hover {
background-color: @shade2;
}
.button:active{
background-color: @shade1;
}
.stack-switcher .button{
border-bottom: 3.5px solid @primary_4;
}
.stack-switcher .button:checked,
.stack-switcher .button:active{
background-color: @shade2;
border-bottom: 7.5px solid @primary_0;
}
.stack-switcher .requires-attention{
border-bottom: 7.5px solid @altprimary_0;
}
陷阱和附加链接:
- 如果您的 CSS 文件包含任何语法错误,程序将无法运行。
- ID/类名称可能会相互混淆。例如,有一个 '.progressbar' 和一个 'GtkProgressBar'
- 与 Gtk 中的主题相关的索引页面。
- 特定于 GTK CSS的页面。