Я ищу способ рендеринга некоторого контейнера виджетов 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 () для этого экземпляра.
Вопрос в том, какой путь предпочтительнее и почему? Или, может быть, есть и другие [лучшие] способы сделать это?
Вы могли бы использовать 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) и дополнительные советы из этого связанного вопроса:
Других решений пока нет …