我试图在设置 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(实例)”失败
(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(实例)”失败
(PCollab:4583):GLib-GObject-CRITICAL **:g_object_unref:断言“G_IS_OBJECT(对象)”失败PCollab:X服务器上的致命IO错误11(资源暂时不可用):0.0。
所以我想通了,然后就跑了
须藤xhost +
它有一些魔力,允许同一个程序两次连接到 X11(或者我在无所不知的互联网上读到)这有一些效果,但不是我想要的。因为现在它给了我一些更神秘的东西:
../../src/xcb_io.c: process_responses: Assertion `(((long) (dpy->last_request_read) - (long)(dpy->request)) <= 0)' failed.
我假设第一个错误意味着 mw 没有指向 Gtk::Window 因为它不被 gtk 视为对象,但事实仍然是当我运行 Gtk 时 mw 完美地显示在我的屏幕上而没有错误::主要 ginit(*mw); 由于我什至不知道这意味着什么,我希望一些 Gtk / X11 大师可以为我指出正确的方向来修复我的代码。
其他细节,我正在使用 gcc 4.4.5 和 gtkmm 2.4 运行 Ubuntu Linux (amd64)