Запуск диалога Gtkmm завершается неудачно - PullRequest
2 голосов
/ 29 ноября 2010

Я пытаюсь открыть диалоговое окно после настройки 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 (object) 'не выполнено

(PCollab: 4583): GLib-GObject-WARNING **: экземпляр недопустимого неинстанцируемого типа `-g-type-private - GTypeFlags '

(PCollab: 4583): GLib-GObject-CRITICAL **: g_signal_emit_valist: утверждение «G_TYPE_CHECK_INSTANCE (экземпляр)» не выполнено

(PCollab: 4583): GLib-GObject-CRITICAL **: g_object_unref: утверждение `G_IS_OBJECT * объект 10 * (23) (объект)1024 * (PCollab: 4583): GLib-GObject-CRITICAL **: g_object_ref: утверждение `G_IS_OBJECT (object) 'не выполнено

(PCollab: 4583): GLib-GObject-WARNING **: экземпляр недопустимого не-instantiatable тип `(null) '

(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: FatОшибка ввода-вывода 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 :: Main ginit (* mw);Поскольку у меня даже нет ни малейшего представления о том, что это значит, я надеюсь, что некоторые гуру Gtk / X11 могут указать мне правильное направление, чтобы исправить мой код.

Другие подробности, я использую Ubuntu Linux (amd64)с gcc 4.4.5 и gtkmm 2.4

Ответы [ 2 ]

1 голос
/ 06 октября 2011
MainWindow::MainWindow() : public Gtk::Window { //etc etc

Это выглядит немного странно, вы пытаетесь наследовать в определении вместо объявления?Или это просто опечатка?

Пример кода в (новом) учебнике (для gtkmm 3) теперь выглядит следующим образом:укладывать вместо кучи?Как

  Gtk::FileChooserDialog dialog("Please choose a folder",
          Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
  dialog.set_transient_for(*this);

  //Add response buttons the the dialog:
  dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
  dialog.add_button("Select", Gtk::RESPONSE_OK);

  int result = dialog.run();

вместо new и указателей?

0 голосов
/ 11 января 2012

Не знаю, действительно ли это важно, но попробуйте изменить строку

MainWindow *mw = new MainWindow;  // delcared as extern in header as well for the dialog

до

MainWindow *mw = new MainWindow();  // delcared as extern in header as well for the dialog
// Missing parentheses --------^
...