C++ 如何在运行中切换GTK CSS样式 问题描述
一旦我的程序从状态a切换到状态B,我想切换按钮的C++ 如何在运行中切换GTK CSS样式 问题描述,c++,gtk,C++,Gtk,一旦我的程序从状态a切换到状态B,我想切换按钮的样式\u上下文。我将我的GTK实例初始化为应用程序,其中包括以下行: provider = gtk_css_provider_new(); gtk_css_provider_load_from_data (provider, gtk_class::css_string.c_str(), -1, NULL); gtk_style_context_add_provider(gtk_widget_get_style_context(mybutton),
样式\u上下文
。我将我的GTK实例初始化为应用程序
,其中包括以下行:
provider = gtk_css_provider_new();
gtk_css_provider_load_from_data (provider, gtk_class::css_string.c_str(), -1, NULL);
gtk_style_context_add_provider(gtk_widget_get_style_context(mybutton),
GTK_STYLE_PROVIDER(myprovider),
GTK_STYLE_PROVIDER_PRIORITY_USER);
这将为mybutton
提供默认样式。当我切换程序状态时,我想关闭这个按钮。因此,我在css样式表中准备了一个名为hidebutton
的类。但是,当我试着打电话时:
gtk_style_context_remove_provider(
gtk_widget_get_style_context(mybutton),
GTK_STYLE_PROVIDER(provider));
gtk_style_context_add_class(
gtk_widget_get_style_context (mybutton),
"hidebutton");
gtk_style_context_add_provider(gtk_widget_get_style_context(mybutton),
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_USER);
似乎什么也没发生
修正尝试
为了解决此问题,我尝试使用以下命令强制重画:
GdkScreen *screen = gdk_screen_get_default();
gtk_style_context_reset_widgets(screen);
在另一次尝试中,我尝试使用该方法强制重画
我错过了什么?
我觉得我可能遗漏了一些明显的东西,但我的代码变得如此复杂以至于我看不到它
标准物质
我的CSS信息:
std::string get_css_string() {
screen_size();
std::string css_string;
std::cout << "width: " << WORK_WIDTH << std::endl;
std::cout << "height: " << WORK_HEIGHT << std::endl;
std::cout << "font-size: " << ((WORK_WIDTH*20)/WORK_HEIGHT) << std::endl;
std::string font_size_string = std::to_string((WORK_WIDTH*20)/WORK_HEIGHT);
css_string = "window { background-color: black; \
color: red; \
font-size: " + font_size_string + "px; \
font-weight: bolder; } \
button { background-image: image(dimgray); \
border-color: dimgray; \
text-shadow: 0 1px black; \
color: red; \
font-size: " + font_size_string + "px; \
font-weight: bolder; } \
.hidebutton {background-image: image(black); \
color: black; \
border-width: 0px; \
border-color: black; } \
.shadowbutton {background-image: image(dimgray); \
color: darkgray; \
font-size: " + font_size_string + "px; \
font-weight: bolder; \
border-width: 0px; \
border-color: black; }";
return css_string;
}
完整的代码,在所有它的凌乱荣耀,可根据要求提供。我不打算在这里全部发帖,因为它是一个跨越多个
fork
s的mmap
变量的纠结。正如我在示例中看到的,您的操作顺序是错误的,在GTK+中,您可以看到:
GtkStyleContext *context;
context = gtk_widget_get_style_context (widget);
gtk_style_context_save (context);
gtk_style_context_add_class (context, "your_css_class");
// render widget
gtk_style_context_remove_class (context, "your_css_class");
您不需要删除提供程序
注:
用相应的gtk_render_u3;()调用替换所有gtk_paint_3;()调用
在css中没有任何.hidebutton
类
这是css
的一个示例:
context = gtk_widget_get_style_context (ebox);
provider = (GtkStyleProvider *)gtk_css_provider_new ();
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
".frame1 {\n"
" border-image: url('gradient1.png') 10 10 10 10 stretch;\n"
"}\n"
".frame2 {\n"
" border-style: solid;\n"
" border-color: rgb(255,0,0);\n"
" border-width: 10;\n"
" border-radius: 10;\n"
"}\n"
".frame3 {\n"
" border-style: solid;\n"
" border-color: rgb(0,0,0);\n"
" border-width: 2;\n"
" border-radius: 10;\n"
"}\n"
".background {\n"
" border-radius: 10;\n"
" border-width: 0;\n"
" background-image: -gtk-gradient (linear, left top, right bottom, from(#ff00ff), to(#aabbcc));\n"
"}\n"
".frame {\n"
" border-style: solid;\n"
" border-width: 1;\n"
" border-radius: 0;\n"
"}\n", -1, NULL);
gtk_style_context_add_provider (context, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
我更新了OP以更正您指出的一些事情(我更改了CSS中的
fakebutton
,以匹配示例中的变量hidebutton
,并在第一个代码段中添加了更多行)。这会改变您的评估吗?@WesH不关心指令顺序和删除提供程序。我测试了按您建议的顺序和不删除运行,屏幕显示相同。在状态更改前后打印上下文属性的GList
时,原始条目将保留,并显示第二个条目。这使它看起来好像原始CSS上下文没有被正确删除。我可以成功删除该类。我创建了一个MWE(),它可以毫无问题地切换类。但是,在我的原始且更复杂的程序()中,print函数报告了正确的类重新分配,但GUI中没有任何更改。@WesH trygtk\u widget\u queue\u draw
在widget或窗口上下文中。
context = gtk_widget_get_style_context (ebox);
provider = (GtkStyleProvider *)gtk_css_provider_new ();
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
".frame1 {\n"
" border-image: url('gradient1.png') 10 10 10 10 stretch;\n"
"}\n"
".frame2 {\n"
" border-style: solid;\n"
" border-color: rgb(255,0,0);\n"
" border-width: 10;\n"
" border-radius: 10;\n"
"}\n"
".frame3 {\n"
" border-style: solid;\n"
" border-color: rgb(0,0,0);\n"
" border-width: 2;\n"
" border-radius: 10;\n"
"}\n"
".background {\n"
" border-radius: 10;\n"
" border-width: 0;\n"
" background-image: -gtk-gradient (linear, left top, right bottom, from(#ff00ff), to(#aabbcc));\n"
"}\n"
".frame {\n"
" border-style: solid;\n"
" border-width: 1;\n"
" border-radius: 0;\n"
"}\n", -1, NULL);
gtk_style_context_add_provider (context, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);