如何在Gtk4中加载Gio Resources?资源加载报错求助
Gtk4中正确加载Gio Resources解决资源不存在报错
问题场景
尝试从Gio资源文件加载CSS主题时,程序运行抛出以下警告:
(main:44395): Gtk-WARNING **: 13:58:23.068: Theme parser error: <broken file>:1:1: The resource at “/com/example/app/css/style.css” does not exist
相关文件及操作如下:
style.css(基础样式文件)
window { background-color: orchid; }
main.c(Gtk应用代码)
#include <gtk/gtk.h> extern GResource *gresources_get_resource(void); static void activate(GtkApplication* application, gpointer data) { GtkWidget* window = gtk_application_window_new(application); GtkCssProvider* provider = gtk_css_provider_new(); GdkDisplay* display = gdk_display_get_default(); gchar* path = "/com/example/app/css/style.css"; gtk_css_provider_load_from_resource(provider, path); gtk_style_context_add_provider_for_display(display, (GtkStyleProvider*)provider, 600); gtk_widget_set_size_request(window, 854, 480); gtk_window_present((GtkWindow*)window); } int main(int argc, char* argv[]) { GtkApplication* application = gtk_application_new("com.example.app", 0); g_resources_register(gresources_get_resource()); g_signal_connect(application, "activate", (GCallback)activate, NULL); g_application_run((GApplication*)application, argc, argv); g_object_unref(application); return 0; }
gresources.xml(资源配置文件)
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/com/example/app/css"> <file>css/style.css</file> </gresource> </gresources>
编译命令
glib-compile-resources --generate-source gresources.xml gcc $(pkg-config --cflags gtk4) main.c gresources.c -o main $(pkg-config --libs gtk4)
错误原因
资源路径不匹配:gresources.xml中prefix="/com/example/app/css"与file="css/style.css"组合后,生成的完整资源路径是**/com/example/app/css/css/style.css**,但代码中调用gtk_css_provider_load_from_resource时使用的路径是/com/example/app/css/style.css,两者不一致导致找不到资源。
解决方法
修改gresources.xml中的file路径,使其与代码中的资源路径匹配:
修改后的gresources.xml
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/com/example/app/css"> <file>style.css</file> </gresource> </gresources>
说明:
prefix已经指定了资源的根路径/com/example/app/css,file只需填写相对于该前缀的文件路径即可,这里style.css直接放在与gresources.xml同目录的css文件夹下,所以去掉file前的css/,让资源路径与代码中调用的/com/example/app/css/style.css完全一致。
重新编译验证
执行以下命令重新生成资源文件并编译:
glib-compile-resources --generate-source gresources.xml gcc $(pkg-config --cflags gtk4) main.c gresources.c -o main $(pkg-config --libs gtk4)
运行程序后,窗口会加载orchid背景色,不再出现资源不存在的警告。
内容的提问来源于stack exchange,提问作者Bret Joseph
相关产品推荐
相关产品推荐

