在Gtkmm中创建自定义IconFactory

时间:2012-10-18 13:39:53

标签: c++ linux gtkmm

我有一个小应用程序,我想创建一些按钮,工具栏等,但我不想使用预先存在的GTK图标主题,我想创建自己的。所以我寻找了教程和诸如此类的东西,但事实证明,在网上讨论得不是很好。所以我试着自己做点什么:

标题文件:

#include <gtkmm.h>
#include <string>
#include <iostream>
#include <errno.h>

class IconFactoryBuilder
{
public:
    IconFactoryBuilder();

    ~IconFactoryBuilder();

    void RegisterNewIcons(std::string pPath);

private:

    Glib::RefPtr<Gtk::IconFactory> mCustomFactory;
};

Cpp文件:

#include <IconFactoryBuilder.h>

IconFactoryBuilder::IconFactoryBuilder() {
    mCustomFactory = Gtk::IconFactory::create();
}

IconFactoryBuilder::~IconFactoryBuilder() {
}

void IconFactoryBuilder::RegisterNewIcons(std::string pPath) {

    Glib::RefPtr<Gtk::IconSet> iconSet = Gtk::IconSet::create();
    Gtk::IconSource someSource;
    try{
        Gtk::Image  *someImage=Gtk::manage(new Gtk::Image(pPath+"appbar.at.png"));
        someImage->set_pixel_size(Gtk::IconSize(48));
        someSource.set_pixbuf(someImage->get_pixbuf());
        someSource.set_size(Gtk::ICON_SIZE_DIALOG);
        someSource.set_size_wildcarded();
    }
    catch(const Glib::Exception &ex) {
        std::cerr << "An error occurred while opening the icon file!" << strerror(errno) << std::endl;
    }
    catch(...) {
        std::cerr << "Unknown Error!" << std::endl;
    }
    iconSet->add_source(someSource);
    const Gtk::StockID somestock("MyNewIcon");
    Gtk::Stock::add(Gtk::StockItem(somestock, "somelabel"));
    mCustomFactory->add(somestock, iconSet);
    mCustomFactory->add_default();
}

但现在我陷入困境,因为我真的不知道如何调用我创建的这个新图标。我也不知道上面写的代码是否足以真正找到图标。

1 个答案:

答案 0 :(得分:1)

您创建了一个图标工厂... factory

- )

您的问题的严肃答案是您不需要Gtk::IconFactory。不幸的是,GTK 2文档并没有告诉你这是不必要的。你需要的是freedesktop.org Standard Icon Naming Specification。创建您的图标,为它们指定简单的名称,根据其中描述的目录结构进行组织,将其安装到适当的位置,当您使用创建PixbufImage时,您的图标将“正常工作” ...from_icon_name()功能。 (example: Gtk::Image::set_from_icon_name()

以下是Gnome开发者wiki中有关如何提供自己的图标的页面: http://developer.gnome.org/integration-guide/stable/icons.html.en

以下是我撰写的有关安装自定义图标的教程的页面:http://ptomato.name/advanced-gtk-techniques/html/desktop-file.html