应用程序是否可以覆盖一个窗口小部件的一个属性的gtk主题?

dsp*_*yer 1 c++ gtk

我正在写一个gtk应用程序,它与我的主题不相符.具体来说,应用程序需要适合只有50像素宽的工具栏,并且需要包含进度条,但主题有ProgressBar :: min-horizo​​ntal-bar-width = 150(这是默认值).我想告诉代码中的gtk,这个特定的小部件可以忽略该特定的样式属性.

我意识到我可以改变我的系统的主题,但如果我在将来做任何与主题相关的事情,应用程序就会破坏.我更喜欢强大的解决方案.

我也更喜欢保持主题其余部分的解决方案,因此进度条看起来很正常(除了更小).

编辑:这是gtk3

iai*_*ain 5

是的你可以.您尚未指定是否需要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);
Run Code Online (Sandbox Code Playgroud)

然后,无论何时创建进度条,您都要忽略主题,请调用

gtk_widget_set_name (progress_bar, "my_progress_bar");
Run Code Online (Sandbox Code Playgroud)

它应该应用自定义样式.

主题系统很难让路径正确,因此可能需要一些摆弄.

资源文件的文档位于:http://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html

但是,所有这些都已经被GTK + 3弃用了,尽管它仍然可以使用,正确的方法是使用这里描述的CSS样式:http://developer.gnome.org/gtk3/stable/GtkCssProvider.html但是我不得不承认我不确定它们是如何工作的,虽然我认为它类似于类似但使用类似CSS的语法


dsp*_*yer 5

得到它了!感谢@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");
Run Code Online (Sandbox Code Playgroud)