Я пытаюсь изменить Gtk::Image
получен объект, предоставив ему pixbuf, но я не могу понять, как к этому приблизиться.
Простая настройка может быть имитирована как:
#include <gtkmm.h>
#include <iostream>
class MyImage : public Gtk::Image
{
public:
void setPixBuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf);
};
void MyImage::setPixBuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf)
{
// How can i override the existing pixbuf here?
}
void freeImagePixelData(const guint8* data)
{
delete[] data;
}
Glib::RefPtr<Gdk::Pixbuf> generateTestImage()
{
guint8 *data = new guint8[40*40*4];
for(int i=0; i<40*40*4; )
{
data[i++] = (guint8)255; // R
data[i++] = (guint8)255; // G
data[i++] = (guint8)0; // B
data[i++] = (guint8)255; // A
}
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(
data, Gdk::Colorspace::COLORSPACE_RGB, true, 8, 40, 40, 40*4, sigc::ptr_fun(&freeImagePixelData));
return pixbuf;
}
int main(int argc, char** argv)
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "com.almost-university.gtkmm.image.pixbuf");
Gtk::Window window;
MyImage im1;
im1.setPixBuf(generateTestImage());
window.add(im1);
window.show_all_children();
app->run(window);
return 0;
}
(Обратите внимание, что это упрощенная версия того, что я пытаюсь выяснить, я знаю, что я должен использовать Gtk :: manage и не добавлять вещи прямо в окно без другого контейнера, это всего лишь макет) ,
Я знаю, что если бы я должен был сгенерировать изображение, используя конструктор так:
Gtk::Image im2(generateTestImage());
window.add(im2);
тогда я бы на самом деле получил желтый квадрат.
Почему-то я отказываюсь верить, что можно использовать pixbuf только во время создания объекта. Должен быть способ как-то установить данные изображения, и я просто не могу найти нужную функцию.
Чтобы установить Pixbuf в Gtk::Image
ты можешь использовать Gtk::Image::set(const Glib::RefPtr< Gdk::Pixbuf >& pixbuf)
метод:
void MyImage::setPixBuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf)
{
set(pixbuf);
}
Других решений пока нет …