Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在运行中切换GTK CSS样式 问题描述_C++_Gtk - Fatal编程技术网

C++ 如何在运行中切换GTK CSS样式 问题描述

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),

一旦我的程序从状态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), 
    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 try
gtk\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);