Построитель 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())


person erandros    schedule 24.10.2011    source источник
comment
Быстрый вопрос, нужно ли вообще уничтожать (освобождать память) окна в main?   -  person Matthew    schedule 06.09.2012


Ответы (1)


Добавьте следующую строку в качестве первой строки в 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(), который запустит основной цикл.

person rodrigo    schedule 24.10.2011
comment
Чтобы запустить графический интерфейс, добавьте kit.run(), поэтому я отмечаю это как правильное. - person erandros; 25.10.2011