无法在基于 gtkmm 的 gnome-panel 小程序上显示图像
Posted
技术标签:
【中文标题】无法在基于 gtkmm 的 gnome-panel 小程序上显示图像【英文标题】:Can't display images on a gtkmm-based gnome-panel applet 【发布时间】:2010-12-15 18:16:37 【问题描述】:我在尝试使用 gtkmm 创建 gnome-panel 小程序时遇到了麻烦。我处理了其中的大部分,但我现在有点受阻。
快速总结:我尝试了 libpanelappletmm,但是当我尝试在面板中添加小程序时,每个程序(甚至是源代码中提供的示例)都会出现段错误。 所以我现在使用 C 库(libpanel-applet)。首先,我寻找一种将 PanelApplet Gobject 包装在 gtkmm C++ 对象中的方法,例如 Gtk::EventBox(PanelApplet 继承自 GtkEventBox)。我试图投射它,但 Glibmm 一直抛出警告(“无法包装对象 'PanelApplet'”)。
所以我创建了一个类“Info”,继承自 Gtk::HBox。在我的 main.cpp 文件中,我声明了它的一个实例,获取底层 GTK 对象(gobj 方法),并使用 GTK+ 函数将其添加到 PanelApplet 中。
这是我的 main.cpp。
#include <iostream>
#include <gtkmm.h>
#include <panel-applet.h>
#include "Info.hpp"
static void manage_timeboxes(BonoboUIComponent *uic, void *applet, const char* data)
std::cout << "manage" << std::endl;
static gboolean getApplet(PanelApplet *applet, const gchar *iid, gpointer data)
/*
if(iid != "OAFIID:TimeboxingApplet")
return false;
*/
Glib::init();
Gtk::Widget* content = new Info();
gtk_container_add(GTK_CONTAINER(applet), content->gobj());
static const char menu_xml[] =
"<popup name=\"button3\">\n"
" <menuitem name=\"Manage\" "
" verb=\"manage_timeboxes\" "
" _label=\"_Gérer l'emploi du temps\"\n"
" pixtype=\"stock\" "
" pixname=\"gtk-properties\"/>\n"
"</popup>\n";
static const BonoboUIVerb linked_verbs[] =
BONOBO_UI_VERB ("manage_timeboxes", manage_timeboxes),
BONOBO_UI_VERB_END
;
panel_applet_setup_menu(applet, menu_xml, linked_verbs, data);
gtk_widget_show_all(GTK_WIDGET(applet));
return true;
PANEL_APPLET_BONOBO_FACTORY (
"OAFIID:TimeboxingApplet_Factory",
PANEL_TYPE_APPLET,
"Timeboxing",
"0.0",
getApplet,
NULL)
如果我在 Info 对象中添加标签或按钮,它会正常工作。
但后来我尝试添加一个图标。 我的第一次尝试是添加一个 Gtk::Image 作为 Info 的属性。
信息.hpp
#ifndef TIMEBOXING_INFO_H
#define TIMEBOXING_INFO_H
#include <gtkmm/box.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>
class Info : public Gtk::HBox
public:
Info();
virtual ~Info();
protected:
Gtk::Image icon;
Gtk::Label info;
;
#endif
信息.cpp
#include "Info.hpp"
#include <gtkmm/image.h>
#include <gtkmm/label.h>
Info::Info() : icon("/home/bastien/programmation/timeboxing-applet/icons/clock-24.png"), info("<b>En cours</b>")
info.set_use_markup();
pack_start(icon);
pack_start(info);
show_all_children();
当我尝试添加小程序时,我收到此错误并且程序中止:
glibmm:ERROR:objectbase.cc:78:void Glib::ObjectBase::initialize(GObject*): assertion failed: (gobject_ == castitem)
我从 Info.hpp 中评论了“Gtk::Image icon”,并像这样修改了我的构造函数:
Info::Info() : info("<b>En cours</b>")
info.set_use_markup();
Gtk::Image icon("/home/bastien/programmation/timeboxing-applet/icons/clock-24.png");
pack_start(icon);
pack_start(info);
show_all_children();
我不再收到 Glibmm 错误,但图像未显示。我尝试使用另一个文件,使用股票中的图标,甚至使用 Gdk::Pixbuf。
提前谢谢你!
【问题讨论】:
【参考方案1】:好吧,奇怪的是,如果我创建一个指向 Gtk::Image
的指针,它就可以工作。
如果有人有解释,那就太好了!
编辑:显然,我不得不调用 Gtk::Main::init_gtkmm_internals。我的包装麻烦消失了。我也可以包装 PanelApplet,但如果我使用生成的 Gtk::EventBox*
它不会显示任何内容。
【讨论】:
以上是关于无法在基于 gtkmm 的 gnome-panel 小程序上显示图像的主要内容,如果未能解决你的问题,请参考以下文章
GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件
“Gtk-WARNING **:无法打开显示:”在 Eclipse 中运行 gtkmm 项目时