Как правильно использовать Gtk :: Offscreen window - PullRequest
0 голосов
/ 08 апреля 2019

Я изо всех сил пытаюсь получить gtkmm3 Gtk::OffscreenWindow для рендеринга на поверхности Каира.Как правильно сделать это?

У меня есть класс, полученный из Gtk::OffscreenWindow Я назвал WidgetRenderer.У меня есть другой класс, полученный из Gtk::DrawingArea рендеринга окончательного DrawingArea, который называется DrawManager.Используя Glib::Refptr, указывающий на Gdk::Pixbuf и получая PixBuf, используя WidgetRenderer.get_pixbuf()

Я попытался изменить Gtk::OffscreenWindow на стандартное окно и напрямую попытался запустить его, используя Gtk::Application.run(WidgetRenderer)

Запуск Solus 4.0 и обновление пакетов с хранилищем.

Конструктор WidgetRenderer:

WidgetRenderer::WidgetRenderer() :
    title("Label")
{
    add(title);
    show_all_children();
    show();
}

Конструктор DrawManager:

MyArea::MyArea() : testNode()
{
    testNode.show();
     std::cout << testNode.get_width() << std::endl;
    m_image = testNode.get_pixbuf();
}

Функция on_draw DrawManager:

bool MyArea::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
{
    Gtk::Allocation allocation = get_allocation();
    const int width = allocation.get_width();
    const int height = allocation.get_height();

    Gdk::Cairo::set_source_pixbuf(cr, m_image, 200, 200);
    cr->paint();

    return true;
}

Основная функция:

Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv);

   Gtk::Window win;
   win.set_title("Test");
   //win.set_default_size(200, 200);

   DrawManager area;

   win.add(area);
   area.show();
   return app->run(win);

Что должно произойти, это то, что этикетка label должна быть напечатана в окне.Вместо этого я получаю белый экран.

...