gtk_widget_draw () альтернатива для gtkmm3

Я ищу способ рендеринга некоторого контейнера виджетов gtk в pixbuf для последующего использования в значке drag’n’drop с использованием gtkmm3.

Насколько мне известно, в нативном gtk3 правильный способ сделать это — использовать gtk_widget_draw () на предоставленной поверхности cairo.

Создание этой поверхности не является проблемой, однако вызов самого gtk_widget_draw () является.

Единственное место, где это упоминается непосредственно в источниках gtkmm-3.4.2, это функция Gtk :: Widget :: draw () (widget.cc:310), которая объявлена ​​как «защищенная».

Поэтому мой вопрос: как мне правильно выполнить такую ​​задачу (рендеринг виджета в pixbuf) в gtkmm3?

На данный момент я вижу два варианта:

  • Подкласс Gtk :: Widget для предоставления открытого интерфейса к защищенной функции draw ()

  • Извлеките экземпляр gobj * из Gtk :: Widget и вызовите нативный gtk gtk_widget_draw () для этого экземпляра.

Вопрос в том, какой путь предпочтительнее и почему? Или, может быть, есть и другие [лучшие] способы сделать это?

3

Решение

Вы могли бы использовать GtkOffscreenWindow собрать pixbuf вашего виджета, из документы :

Идея состоит в том, чтобы взять виджет и вручную установить его состояние, добавить его
в OffscreenWindow, а затем получить снимок как Gdk :: Pixbuf.

и функция:

Glib::RefPtr<Gdk::Pixbuf> Gtk::OffscreenWindow::get_pixbuf  (       )
Retrieves a snapshot of the contained widget in the form of a Gdk::Pixbuf.

Вы также можете собрать пример кода (на python) и дополнительные советы из этого связанного вопроса:

Как нарисовать любой виджет GTK поверх поверхности Каира

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]