Я пытаюсь открыть диалоговое окно после настройки Gtkmm следующим образом:
MainWindow::MainWindow() : public Gtk::Window { //etc etc
и в main ()
Gtk::Main ginit(argc,argv);
MainWindow *mw = new MainWindow; // delcared as extern in header as well for the dialog
ginit.run(*mw);
когда инициируется необходимое событие, следующий код должен выполняться, но не работает. Что странно, поскольку пример на http://library.gnome.org/devel/gtkmm-tutorial/2.21/sec-dialogs-filechooserdialog.html.en компилируется и отлично работает.
Gtk::FileChooserDialog *dlg = new Gtk::FileChooserDialog(Glib::ustring("choose destination"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
dlg->set_transient_for(*mw);
dlg->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
dlg->add_button(Glib::ustring("Select"), Gtk::RESPONSE_OK);
dlg->show_all_children();
int response =dlg->run();
Согласно GDB, все это терпит неудачу при dlg-> run (); И, чтобы было веселее, он дает мне одну из двух ошибок:
(PCollab: 4583): GLib-GObject-CRITICAL **: g_object_ref: утверждение `G_IS_OBJECT (объект) 'не выполнено
(PCollab: 4583): GLib-GObject-WARNING **: экземпляр недопустимого типа, не поддерживающего создание экземпляров, `-g-type-private - GTypeFlags '
(PCollab: 4583): GLib-GObject-CRITICAL **: g_signal_emit_valist: утверждение `G_TYPE_CHECK_INSTANCE (instance) 'не выполнено
(PCollab: 4583): GLib-GObject-CRITICAL **: g_object_unref: утверждение `G_IS_OBJECT (объект) 'не выполнено
(PCollab: 4583): GLib-GObject-CRITICAL **: g_object_ref: утверждение `G_IS_OBJECT (объект) 'не выполнено
(PCollab: 4583): GLib-GObject-WARNING **: экземпляр недопустимого типа, не поддерживающего создание экземпляра `(null) '
(PCollab: 4583): GLib-GObject-CRITICAL **: g_signal_emit_valist: утверждение `G_TYPE_CHECK_INSTANCE (instance) 'не выполнено
(PCollab: 4583): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object) 'failed PCollab: Fatal IO error 11 (ресурс временно недоступен) на X-сервере: 0.0.
Итак, я подумал, что, черт возьми, и побежал
sudo xhost +
Что творит некую магию, позволяющую одной и той же программе дважды подключаться к X11 (по крайней мере, я читал в всезнающем Интернете). Это имеет некоторый эффект, но не тот, который я желаю. Потому что теперь это дает мне нечто гораздо более загадочное:
../../src/xcb_io.c: process_responses: Assertion `(((long) (dpy->last_request_read) - (long)(dpy->request)) <= 0)' failed.
Я бы предположил, что первая ошибка означает, что mw не указывает на Gtk :: Window, поскольку он не считается объектом gtk, но факт остается фактом: mw отображается на моем экране без ошибок, когда я запускаю Gtk :: Главный гинит (* mw); Поскольку я не имею ни малейшего представления о том, что это значит, я надеюсь, что какой-нибудь гуру Gtk / X11 сможет указать мне правильное направление, чтобы исправить мой код.
Другие подробности, я запускаю Ubuntu Linux (amd64) с gcc 4.4.5 и gtkmm 2.4
xhost +
не должен делать ничего особенного или отличного от вашего приложения. Какая ошибка отображается в GDB вdlg->run()
? - person Diego Sevilla   schedule 29.11.2010