gtkmm builder из файла glade не работает - PullRequest
3 голосов
/ 24 октября 2011

Моя программа 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() строки)

1 Ответ

5 голосов
/ 25 октября 2011

Добавьте следующую строку в качестве первой строки в main:

Gtk::Main kit(argc, argv);

В соответствии с учебником Gtkmm Hello World :

Сначала мысоздать объект с именем kit.Это типа Gtk :: Main.Каждая программа gtkmm должна иметь один из них.

Этот объект отвечает за инициализацию всей библиотеки GTK +, которая включает в себя вызов функции g_type_init, о которой говорится в вашей ошибке.

Конечно, вы можете использовать любое имя, которое вам нравится, вместо kit.

ОБНОВЛЕНИЕ: О, и вам следует позвонить:

Gtk::Main::run();

Или эквивалентно:

kit.run();

, как любезно отмечено Эрандросом в комментарии.Без этого программа завершит работу сразу.Он выдаст вызов gtk_main(), который запустит основной цикл.

...