当前在 Gtk 4.12.3 wayland 中使用 css 的正确方法是什么? 我收到有关 StyleContext 的相互矛盾的信息,其中一些文档说它已贬值,而另一些文档则说它适合显示。 我尝试过
Gtk.StyleContext.add_provider_for_display()
和 set_css_classes()
,它们有效,但会发出大量警告,如下所示:
/home/cpb/Desktop/txt/source/valatemp_nil.vala:31.3-31.18: warning: `Gtk.StyleContext' has been deprecated since 4.10
31 | Gtk.StyleContext.add_provider_for_display(thisdisplay, allcsp, Gtk.STYLE_PROVIDER_PRIORITY_USER);
| ^~~~~~~~~~~~~~~~
/home/cpb/Desktop/txt/source/valatemp_nil.vala.c: In function ‘__lambda4_’:
/home/cpb/Desktop/txt/source/valatemp_nil.vala.c:127:61: warning: passing argument 2 of ‘gtk_widget_set_css_classes’ from incompatible pointer type [-Wincompatible-pointer-types]
127 | gtk_widget_set_css_classes ((GtkWidget*) container, _tmp10_);
| ^~~~~~~
| |
| gchar ** {aka char **}
In file included from /usr/include/gtk-4.0/gtk/gtkapplication.h:26,
from /usr/include/gtk-4.0/gtk/gtkwindow.h:32,
from /usr/include/gtk-4.0/gtk/gtkaboutdialog.h:29,
from /usr/include/gtk-4.0/gtk/gtk.h:33,
from /home/cpb/Desktop/txt/source/valatemp_nil.vala.c:10:
/usr/include/gtk-4.0/gtk/gtkwidget.h:929:71: note: expected ‘const char **’ but argument is of type ‘gchar **’ {aka ‘char **’}
929 | const char **classes);
...
以及示例应用程序, css 是一个字符串,输入到 CssProvider 中,然后输入到 StyleContext 中进行默认显示,由每个小部件的 set_css_classes 使用:
using Gtk;
int main (string[] args) {
Gtk.Application wut = new Gtk.Application ("com.test.test", GLib.ApplicationFlags.DEFAULT_FLAGS);
wut.activate.connect(() => {
Gtk.ApplicationWindow win = new Gtk.ApplicationWindow(wut);
Gtk.Box container = new Gtk.Box(VERTICAL,0);
Gtk.Box socket = new Gtk.Box(HORIZONTAL,0);
Gtk.ToggleButton btn = new Gtk.ToggleButton();
string csses = """
.rr {
background: #FF5555;
}
.bb {
background: #5555FF;
}
.gg {
background: #55ff55;
}
""";
Gtk.CssProvider allcsp = new Gtk.CssProvider();
allcsp.load_from_string(csses);
Gdk.Display thisdisplay = Gdk.Display.get_default();
Gtk.StyleContext.add_provider_for_display(thisdisplay, allcsp, Gtk.STYLE_PROVIDER_PRIORITY_USER);
container.set_css_classes({"bb"});
socket.set_css_classes({"gg"});
btn.set_css_classes({"rr"});
socket.append(btn);
container.append(socket);
win.set_child(container);
win.default_width = 300;
win.default_height = 300;
win.present();
});
return wut.run(args);
}
经过一番研究,我找到了答案:这是一个文档错误。具体在 Gtk 文档和 Vala 的绑定中。
Gtk 文档说整个
Gtk.StyleContext
类已被弃用,但这是一个错误。仅弃用函数,类的静态函数(Gtk.StyleContext.add_provider_for_display
和 Gtk.StyleContext.remove_provider_for_display
)和类本身并未弃用。
这是一个谈论它的问题。
总之,正确的做法是使用
Gtk.StyleContext.add_provider_for_display()
,抛出的异常是Vala的bind中的错误,遵循Gtk文档中的错误。