2011-10-24 4 views
1

私のgtkmmプログラムはウィンドウを表示しません。コンパイルは正常に動作します。これらは、実行しているときに私が得るメッセージです:gladeファイルのgtkmmビルダーが動作しない

(process:2312): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.24.1/gobject  
/gtype.c:2706: You forgot to call g_type_init() 
(process:2312): GLib-CRITICAL **: g_once_init_leave: assertion 
`initialization_value != 0' failed 
(process:2312): GLib-GObject-CRITICAL **: g_object_newv: assertion 
`G_TYPE_IS_OBJECT (object_type)' failed 

コードは次のとおりです。

int main(int argc, char** argv) { 
    Glib::RefPtr<Gtk::Builder> builder = 
     Gtk::Builder::create_from_file("basic.glade"); 
    Gtk::Window* pMyWindow = 0; 
    builder->get_widget("window1", pMyWindow); 
    pMyWindow->show(); 
} 

basic.gladeが有効なファイルであるか、存在しない場合、それは問題ではありません。私はbasic.gladeの代わりに全体のパスファイルを試しました。
私はそれをデバッグするとき、私はプログラムがそのビルダーの最初の行から抜け出すことはないことを認識します。それは実行し続けるようなものなので、唯一のプロセスを一時停止すると、どちらかがg_once_init_enter_impl()またはg_slist_find()(前者によって呼び出されます)になります。 (それは決してそのpMyWindow->show()ラインに到達していないので) だから私は今まで

+0

簡単な質問ですが、メインのウィンドウをすべて破棄(メモリを解放)する必要がありますか? – Matthew

答えて

3

mainであなたの最初の行として次の行を追加します。任意のウィンドウが表示されない:

Gtk::Main kit(argc, argv); 

Gtkmm Hello World tutorialによると:

まず、kitというオブジェクトをインスタンス化します。これはGtk :: Mainのタイプです。すべてのgtkmmプログラムには、これらのいずれかが必要です。

このオブジェクトは、についてのあなたのエラーの話g_type_init関数の呼び出しが含まれ、すべてのGTK +ライブラリを、初期化する責任があります。

もちろん、kitではなく任意の名前を使用できます。

UPDATE:ああ、あなたはに呼び出す必要があります:

Gtk::Main::run(); 

または同等に:

kit.run(); 

が親切としてコメントにErandrosによって指摘。それがなければ、プログラムはimmediatleyを終了します。メインループを実行するgtk_main()コールを発行します。

+0

GUIを実行するには、 'kit.run()'を追加してください。これを正しいものとしてマークします。 – Erandros

関連する問題