gtk4 styleprovider 与 set_css_classes

问题描述 投票:0回答:1

当前在 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);
}
vala gtk4
1个回答
0
投票

经过一番研究,我找到了答案:这是一个文档错误。具体在 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文档中的错误。

© www.soinside.com 2019 - 2024. All rights reserved.