GtkText添加CSS边框后右键菜单失效问题及解决方法咨询
解决GtkText添加CSS边框后右键菜单失效的问题
问题现象
为GtkText组件添加CSS边框后,出现以下异常:
- 右键上下文菜单的复制、粘贴功能无法使用
- 控制台输出警告:
Gtk-WARNING **: 23:17:00.572: Broken accounting of active state for widget 0x5591d99d8220(GtkPopoverMenu)
测试代码如下:
#include <gtk/gtk.h> static const char *css = "text {" " all: unset;" " border: 1px solid black;" /*copy past from right click contextmenu not working by this line */ " min-height:20px;" " padding-left: 10px;" " font-size: 9.5px;" "}" ; static void activate (GtkApplication* app, gpointer user_data) { GtkWidget *window; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Window"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_window_present (GTK_WINDOW (window)); GtkWidget *grid = gtk_grid_new (); gtk_window_set_child (GTK_WINDOW (window), grid); GtkCssProvider* provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (provider, css, -1); gtk_style_context_add_provider_for_display (gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); GtkWidget *text = gtk_text_new(); gtk_grid_attach ((GtkGrid *)grid, text, 0, 0, 1, 1); gtk_window_present (GTK_WINDOW(window)); } int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; }
问题原因
CSS中的all: unset;会重置GtkText组件的所有默认样式规则,包括与组件内部交互、上下文菜单关联的状态样式和行为依赖样式,导致组件的状态管理逻辑异常,进而引发右键菜单功能失效和警告。
解决方法
移除all: unset;语句,仅保留需要自定义的样式属性即可恢复功能:
修改后的CSS代码:
text { border: 1px solid black; min-height:20px; padding-left: 10px; font-size: 9.5px; }
如果需要重置部分样式,可针对性地覆盖特定属性(如background-color、color),避免使用all: unset破坏组件的默认行为基础。
内容的提问来源于stack exchange,提问作者dibyendu
相关产品推荐
相关产品推荐

