如何在C++中获取GTK+3主题颜色(适配Inkscape问题)
Hey there! I get that you're working on an Inkscape-related issue and need to pull GTK+3 theme colors (like text and background) into C++ variables, especially since the Python examples you found are either outdated or don't translate cleanly to C++. Let's walk through this step by step, with focus on the parts that matter most for someone learning this stuff.
In GTK+3, all theme-related styling (including colors) is managed through GtkStyleContext. This object holds the style information for a widget, including colors pulled from the active theme. To get specific colors, you'll need to interact with this context.
Here's a working example that retrieves background and foreground (text) colors, with explanations for each part:
#include <gtk/gtk.h> #include <iostream> int main(int argc, char *argv[]) { // First, initialize GTK (critical! Don't skip this) gtk_init(&argc, &argv); // Create a dummy widget (we'll use a window here; you can use your actual Inkscape widget instead) GtkWidget *widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Get the style context for the widget GtkStyleContext *style_ctx = gtk_widget_get_style_context(widget); // Variables to store our colors (GdkRGBA holds red, green, blue, alpha values 0.0-1.0) GdkRGBA bg_color, fg_color; // Retrieve background color (for the "normal" widget state) gtk_style_context_get_color(style_ctx, GTK_STATE_FLAG_NORMAL, "background", &bg_color); std::cout << "Background Color:" << std::endl; std::cout << " R: " << bg_color.red << " G: " << bg_color.green << " B: " << bg_color.blue << " A: " << bg_color.alpha << "\n"; // Retrieve foreground (text) color gtk_style_context_get_color(style_ctx, GTK_STATE_FLAG_NORMAL, "foreground", &fg_color); std::cout << "\nForeground (Text) Color:" << std::endl; std::cout << " R: " << fg_color.red << " G: " << fg_color.green << " B: " << fg_color.blue << " A: " << fg_color.alpha << "\n"; // Clean up resources g_object_unref(style_ctx); gtk_widget_destroy(widget); gtk_main_quit(); return 0; }
How to Compile This
To run the code, you'll need to link against the GTK+3 libraries. Use this command in your terminal:
g++ theme_color.cpp -o theme_color $(pkg-config --cflags --libs gtk+-3.0)
- Always use a real widget (or dummy): GTK+ theme colors are tied to widget types (e.g., a button's background vs. a window's background) and states. Using a dummy window like in the example works, but if you're working within Inkscape, use the actual widget you want to match the theme of.
- Widget states matter: The
GTK_STATE_FLAG_NORMALwe used is for the default, inactive state. Other common states include:GTK_STATE_FLAG_HOVER: When the mouse is over the widgetGTK_STATE_FLAG_ACTIVE: When the widget is clicked/pressedGTK_STATE_FLAG_SELECTED: When the widget's content is selected
- More color properties to explore: Beyond "background" and "foreground", you can grab things like:
"border-color"for widget borders"selected-background"for selected text backgrounds"selected-foreground"for selected text color
- Wait for the theme to load: If you're getting default colors instead of your active theme, make sure you're retrieving colors after the widget has been shown (use
gtk_widget_show_all(widget)before getting the context).
The Python example you found might have only partially worked because:
- In Python, GTK bindings sometimes abstract away steps like initializing the style context properly
- In C++, you have to be explicit about initializing GTK and cleaning up resources
- If you didn't tie the style context to a real widget, you might have gotten fallback colors instead of your actual theme
- GTK+3 CSS Property Reference: The official docs list all CSS properties (including color ones) that GTK+3 recognizes. You can look up which properties apply to different widget types.
- System Theme Files: You can explore your system's GTK themes (usually in
/usr/share/themes/or~/.themes/) to see how colors are defined in the.cssfiles—this helps you know exactly which property names to use.
内容的提问来源于stack exchange,提问作者DATALOT

