gtkmmでgnome-panelアプレットを作成する際に問題が発生しました。私はそれらの大部分を扱っていましたが、私は現在、一種のブロックされています。gtkmmベースのgnome-panelアプレットに画像を表示できません
私はlibpanelappletmmを試しましたが、パネルにアプレットを追加しようとすると、すべてのプログラム(ソースコードで提供されているサンプルも)がsegfaultsします。 Cライブラリ(libpanel-applet)を使用します。最初に、gtkmm C++オブジェクトにPanelApplet Gobjectをラップする方法を探しました。たとえば、Gtk :: EventBox(PanelAppletはGtkEventBoxから継承)です。私はキャストしようとしましたが、Glibmmは警告をスローし続けました( "オブジェクト 'PanelApplet'をラップできませんでした)。
私はGtk :: HBoxから継承したクラス "Info"を作成しました。私の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オブジェクトにラベルやボタンを追加しても問題ありません。
しかし、その後、アイコンを追加しようとしました。 私の最初の試みは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
私はアプレットを追加しようとするとInfo.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)
私がコメント"Gtk :: Image icon"をInfo.hppから取得しました。このようにコンストラクタを変更しました:
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を使って、別のファイルを試してみました。
ありがとうございます!