问题样式设置Gtk :: Box,在gtkmm 3.10.1中带有CSS

问题描述 投票:0回答:1

我必须用gtkmm编写一个程序,该程序可以在具有GTK 3.10.1的旧系统上运行。因此,我必须避免在此之后添加的任何功能。

我在使用CSS样式化Gtk :: Box实例时遇到一些麻烦。它可以在具有gtkmm 3.18.0的Ubuntu 16.04盒上正常工作,但是在具有3.10.1的Ubuntu 14.04上,CSS不适用于Gtk :: Box实例。

下面是一个简化的示例。以下是该示例如何分别在Ubuntu 16.04 / gtkmm 3.18.0和Ubuntu 14.04 / gtkmm 3.10.1上呈现的屏幕截图。

enter image description here enter image description here

可以看出,在gtkmm 3.10.1上未设置包含“ YEP”标签的Gtk :: Box的样式(边框和背景)。

  1. 我缺少明显的东西吗?
  2. 这是3.10.1的已知问题吗?
  3. 关于如何在Ubuntu 14.04 / gtkmm 3.10.1上实现预期结果的任何建议?

谢谢!

代码:

// styletest.cpp

#include <gtkmm.h>

class StyleTestWindow : public Gtk::Window
{
public:
  StyleTestWindow();
  virtual ~StyleTestWindow() = default;

protected:
  Gtk::Box    mainbox;
  Gtk::Label  label;
};

StyleTestWindow::StyleTestWindow() :
  mainbox(Gtk::ORIENTATION_VERTICAL)
{
  set_size_request(300, 200);
  set_position(Gtk::WIN_POS_CENTER);
  set_border_width(50);
  set_decorated(false);

  auto css = Gtk::CssProvider::create();
  css->load_from_path("./styletest.css");
  get_style_context()->add_provider_for_screen(Gdk::Screen::get_default(), 
                                               css, 
                                               GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
  get_style_context()->add_class("mainwin");

  label.get_style_context()->add_class("yeplabel");
  label.set_halign(Gtk::ALIGN_CENTER);
  label.set_valign(Gtk::ALIGN_CENTER);
  label.set_text("YEP!");

  mainbox.get_style_context()->add_class("mainbox");
  mainbox.pack_start(label);
  add(mainbox);

  show_all_children();
}

int
main(int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "com.example.styletest");

  StyleTestWindow mainWindow;
  return app->run(mainWindow);
}

CSS:

/* styletest.css */

.mainwin {
    background: #DEB887;
    border: 5px solid #996600;
}

.mainbox {
    background: #cc9900;
    border: 5px solid #C00000;
}

.yeplabel {
    color: #FFFFFF;
    background: #A52A2A;
    font: Comic Sans MS 16;
    padding: 10px;
}

构建方式:

g++ -std=c++11 styletest.cpp -o styletest `pkg-config gtkmm-3.0 --cflags --libs`
css gtk gtk3 gtkmm gtkmm3
1个回答
1
投票

@ lb90的评论使我找到了解决方案。

使用样式上下文引入Gtk :: Box背景和边框的缺少呈现的提交在这里:https://gitlab.gnome.org/GNOME/gtk/commit/698488ddc4

使用上述提交中的技术,我可以解决此问题。我介绍了一个StyleBox类,该类继承自Gtk :: Box并覆盖on_draw()处理函数。在on_draw()中,呈现了背景和边框。

在示例代码StyleTestWindow.cpp中,只需将Mainbox的类型从Gtk :: Box更改为StyleBox。

StyleBox.h

class StyleBox : public Gtk::Box
{
public:
  explicit StyleBox(Gtk::Orientation orientation =  Gtk::ORIENTATION_HORIZONTAL, int spacing =  0) :
    Gtk::Box(orientation, spacing)
  {
  }

  virtual ~StyleBox() = default;

protected:
  virtual bool on_draw(const ::Cairo::RefPtr< ::Cairo::Context>& cr) override
  {
    GtkWidget *widget = GTK_WIDGET(gobj());
    GtkStyleContext *context;
    GtkAllocation alloc;
    cairo_t *ccr = const_cast<cairo_t*>(cr->cobj());

    context = gtk_widget_get_style_context (widget);
    gtk_widget_get_allocation (widget, &alloc);

    gtk_render_background(context, ccr, 0, 0, alloc.width, alloc.height);
    gtk_render_frame(context, ccr, 0, 0, alloc.width, alloc.height);

    return Box::on_draw(cr);
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.