Не удается запустить диалог Gtkmm

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


person Michael    schedule 29.11.2010    source источник
comment
Если вы не выполняете программу под другим пользователем, отличным от вашей системы X Window, xhost + не должен делать ничего особенного или отличного от вашего приложения. Какая ошибка отображается в GDB в dlg->run()?   -  person Diego Sevilla    schedule 29.11.2010
comment
Вы используете потоки в своей программе?   -  person ptomato    schedule 30.11.2010
comment
@ptomato, единственный поток в моей программе - это цикл Gtk :: Main, который запускается из моей функции main (), все остальное основано на событиях и вызывается через цикл gtk.   -  person Michael    schedule 30.11.2010
comment
Не могли бы вы максимально упростить свою программу и вставить ее в свой вопрос? Вы даже можете найти проблему, выполнив эти упрощения ...   -  person davidag    schedule 16.12.2010
comment
Здесь та же проблема. Вы нашли какие-нибудь решения?   -  person    schedule 12.07.2011
comment
Ссылка на документацию, похоже, была изменена на разработчик .gnome.org / gtkmm-tutorial / stable / прямо сейчас. Вероятно, это было сделано одновременно с выпуском gtkmm3.   -  person AzP    schedule 06.10.2011


Ответы (2)


MainWindow::MainWindow() : public Gtk::Window { //etc etc

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

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

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  void on_button_file_clicked();
  void on_button_folder_clicked();

  //Child widgets:
  Gtk::VButtonBox m_ButtonBox;
  Gtk::Button m_Button_File, m_Button_Folder;
};

Вы пробовали размещать переменные в стеке, а не в куче? Нравится

  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 и указателями?

person AzP    schedule 06.10.2011

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

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

to

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