我试图在设置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型私人 - 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:断言`G_IS_OBJECT(object)'失败PCollab: 致命IO错误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大师可以指出我正确的方向来修复我的代码。
其他细节,我用gcc 4.4.5和gtkmm 2.4运行Ubuntu Linux(amd64)
答案 0 :(得分:1)
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
和指针?
答案 1 :(得分:0)
不知道这是否真的很重要,但请尝试更改
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 --------^