css - 在 gtkmm3/gtk3 中以编程方式更改小部件预属性

标签 css styles gtk3 gtkmm3

我已经开始将我的一些 gtkmm2 应用程序移植到 gtkmm3,但我不清楚从应用程序内部更改小部件的属性(例如颜色)以响应状态更改的正确机制。这是一个简短的示例,说明了我要实现的目标,即根据某些定义的状态反转按钮图像和文本的颜色:

我创建了一个窗口 (Gwin) 并硬编码了一个短的 CSS 字符串,该字符串足以在启动时定义小部件的开始状态:

int main(int argc, char *argv[])
{
   try
   {
        Gtk::Main *kit(new Gtk::Main(argc, argv));
        GWin *dl(new GWin(sdi, argc, argv));

        auto screen = dl->get_screen();
        Glib::RefPtr<Gtk::CssProvider> css(Gtk::CssProvider::create());
        Glib::RefPtr<Gtk::StyleContext> style(dl->get_style_context());

        Glib::ustring theme(
                      "@define-color bg rgb(57.64%, 48.62%, 36.47%);"
                      "@define-color BtnBg rgb(23.13%, 19.60%, 16.07%);"
                      ".background { background-color: @bg; }"
                      "button"
                      "{"
                      "   background-image:image(@BtnBg);"
                      "   border-color: @bg;"
                      "   color: rgb(80.%, 80.%, 80.%);"
                      "   padding-left: 4px;"
                      "   padding-right: 4px;"
                      "}"
                      "button:hover"
                      "{"
                      "   background-image:image(rgb(77%, 81%, 84%));"
                      "   color: rgb(0.%, 0.%, 0.%);"
                      "}"
                      "#LSK0 { background-image: image(@bg); border-color:@bg }"
                      "#RSK0 { background-image: image(@bg); border-color:@bg }"
                      );
      css->load_from_data(theme);
      style->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);



     dl->Run();
     delete kit;
   }
   catch(const std::string &e)
   {
      std::cout << "ERROR: GWin now exits:\n" << e << std::endl;
   }
   return(0);
}

现在在 GWin 类中,相关的代码片段是以下信号处理程序,它在 mRunButton Gtk::Button 上运行,它已使用 mRunButton.set_name("RunButton") 初始化:

void GCDU::onBtnLight(bool on)
{
   // The GTK3 code
   Glib::RefPtr<Gtk::CssProvider> css(Gtk::CssProvider::create());
   Glib::RefPtr<Gtk::StyleContext> style(mRunButton.get_style_context());

   Glib::ustring theme(on ?
                       "#RunButton { background-image: image(rgb(80%, 80%, 80%); color: rgb(0.%, 0.%, 0.%); }"
                       :
                       "#RunButton { background-image: image(rgb(23.13%, 19.60%, 16.07%)); color: rgb(80.%, 80.%, 80.%); }"
                      );
   css->load_from_data(theme);
   style->add_provider(css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

   // The old GTK2 code
   //Gdk::Color c(mButtonBG);
   //Gdk::Color f;
   //if(on)
   //{
   //   c.set("white");
   //   f.set("black");
   //}
   //else
   //{
   //   f.set("white");
   //}
   //mRunButton.modify_bg(Gtk::STATE_NORMAL, c);
   //mRunButton.get_child()->modify_fg(Gtk::STATE_NORMAL, f);
}

我四处搜索,但大多数问题及其答案似乎仅限于在运行开始时为主题设置一次样式属性或使用现已弃用的 override_ 方法。

感谢您查看问题。

最佳答案

好吧,在对诸如 this 等问题进行更多研究之后和 this我找到了我认为是做我需要的事情的正确方法。

基本定义在将 CSS 提供程序添加到窗口时小部件样式将保持的状态的属性:

从上面有问题的 main() 更新:

Glib::ustring theme(
                      "@define-color bg rgb(57.64%, 48.62%, 36.47%);"
                      "@define-color BtnBg rgb(23.13%, 19.60%, 16.07%);"
                      ".background { background-color: @bg; }"
                      "button"
                      "{"
                      "   background-image:image(@BtnBg);"
                      "   border-color: @bg;"
                      "   color: rgb(80.%, 80.%, 80.%);"
                      "   padding-left: 4px;"
                      "   padding-right: 4px;"
                      "}"
                      "button:hover"
                      "{"
                      //"   background-image:image(rgb(77%, 81%, 84%));"
                      "   background-image:image(#FF4300);"
                      "   color: rgb(100.%, 100.%, 100.%);"
                      "}"
                      "#LSK0 { background-image: image(@bg); border-color: @bg }"
                      "#RSK0 { background-image: image(@bg); border-color: @bg }"
                      ".RunButton { background-image: image(rgb(80%, 80%, 80%)); color: rgb(0.%, 0.%, 0.%); }"
                      );

另请注意,“RunButton”样式的属性现在列为类 (.RunButton),NOT 列为 ID (#RunButton)。

这将样式作为类添加到窗口小部件的上下文中,但尚未将其应用于任何内容。然后在代码执行期间以编程方式响应状态更改事件,通过添加和删除样式属性类来更新小部件样式:

void GWin::onBtnLight(bool on)
{
   if(on)
   {
      mRunButton.get_style_context()->add_class("RunButton");
   }
   else
   {
      mRunButton.get_style_context()->remove_class("RunButton");
   }
}

现在小部件上的按钮和标签颜色在​​ RunButton 样式类和默认样式类之间切换。

关于css - 在 gtkmm3/gtk3 中以编程方式更改小部件预属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984037/

相关文章:

android - 我们可以使用android :attr/spinnerStyle for TextView in Android吗

wpf - StyleSelector 并从 XAML 返回样式

python - 如何使用 gtk3 在 python 中创建类似列表的 gui?

python - 如何使用 Python 在 Gtk3 中显示 png 图像?

Windows 上的 Python GTK CSS 问题

html - 如何使 float 页面 div 响应

html - 一个文档可以有超过 1 个响应式 CSS 样式表吗?如果是这样,如何?

linux - 为什么 GCC(和其他工具)不遵循 GNU 命令选项约定准则?

html - 黑色 50px 阴影从不透明度 1 开始到不透明度 0 结束(逐渐)

css - 尽管有 MIME 类型,但样式表未在 IE 9 中加载