我正在写一个gtk应用程序,它与我的主题不相符.具体来说,应用程序需要适合只有50像素宽的工具栏,并且需要包含进度条,但主题有ProgressBar :: min-horizontal-bar-width = 150(这是默认值).我想告诉代码中的gtk,这个特定的小部件可以忽略该特定的样式属性.
我意识到我可以改变我的系统的主题,但如果我在将来做任何与主题相关的事情,应用程序就会破坏.我更喜欢强大的解决方案.
我也更喜欢保持主题其余部分的解决方案,因此进度条看起来很正常(除了更小).
编辑:这是gtk3
是的你可以.您尚未指定是否需要GTk + 2或3.
在2中,您可以通过在代码中创建仅适用于命名窗口小部件的资源来实现.然后,您可以设置进度条的名称.
char *custom_theme = "style \"Custom\" { ProgressBar::min-horizontal-bar-width = 10 }\n widget \"*.GtkProgressBar.my_progress_bar\" style \"Custom\"";
. . .
// After you've initialised the gtk system
gtk_rc_parse_string (custom_theme);
然后,无论何时创建进度条,您都要忽略主题,请调用
gtk_widget_set_name (progress_bar, "my_progress_bar");
它应该应用自定义样式.
主题系统很难让路径正确,因此可能需要一些摆弄.
资源文件的文档位于:http://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html
但是,所有这些都已经被GTK + 3弃用了,尽管它仍然可以使用,正确的方法是使用这里描述的CSS样式:http://developer.gnome.org/gtk3/stable/GtkCssProvider.html但是我不得不承认我不确定它们是如何工作的,虽然我认为它类似于类似但使用类似CSS的语法
得到它了!感谢@iain指出我正确的方向.
GtkCssProvider* provider = gtk_css_provider_new();
const char* css = "GtkProgressBar#small { -GtkProgressBar-min-horizontal-bar-width: 1; }";
gtk_css_provider_load_from_data(provider, css, strlen(css), NULL);
GdkDisplay *display = gdk_display_get_default ();
GdkScreen *screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen,
                       GTK_STYLE_PROVIDER (provider),
                       GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
peakProgressBar.set_name("small");