给定 PixBuf 后如何在创建对象后更改 Gtk::Image
How to change Gtk::Image after object creation when PixBuf is given
我试图通过给它 pixbuf 来改变 Gtk::Image
派生的对象,但我不知道如何处理它。
简单的设置可以模拟为:
#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,而不是直接向 window 添加内容而不添加其他内容容器,这只是一个模型)。
我知道如果我要像这样使用构造函数生成图像:
Gtk::Image im2(generateTestImage());
window.add(im2);
那么我实际上会得到一个黄色方块。
我不相信在创建对象时只能使用 pixbuf。一定有办法设置图像数据,我只是找不到需要的功能。
要在 Gtk::Image
中设置 Pixbuf,您可以使用 Gtk::Image::set(const Glib::RefPtr< Gdk::Pixbuf >& pixbuf)
方法:
void MyImage::setPixBuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf)
{
set(pixbuf);
}
我试图通过给它 pixbuf 来改变 Gtk::Image
派生的对象,但我不知道如何处理它。
简单的设置可以模拟为:
#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,而不是直接向 window 添加内容而不添加其他内容容器,这只是一个模型)。
我知道如果我要像这样使用构造函数生成图像:
Gtk::Image im2(generateTestImage());
window.add(im2);
那么我实际上会得到一个黄色方块。
我不相信在创建对象时只能使用 pixbuf。一定有办法设置图像数据,我只是找不到需要的功能。
要在 Gtk::Image
中设置 Pixbuf,您可以使用 Gtk::Image::set(const Glib::RefPtr< Gdk::Pixbuf >& pixbuf)
方法:
void MyImage::setPixBuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf)
{
set(pixbuf);
}