gpt4 book ai didi

c++ - 运行 Gtkmm 对话框失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:01 26 4
gpt4 key购买 nike

我试图在设置 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: assertion `G_IS_OBJECT (object)' failed

(PCollab:4583): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `-g-type-private--GTypeFlags'

(PCollab:4583): GLib-GObject-CRITICAL **: g_signal_emit_valist: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(PCollab:4583): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed

(PCollab:4583): GLib-GObject-CRITICAL **: g_object_ref: assertion `G_IS_OBJECT (object)' failed

(PCollab:4583): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `(null)'

(PCollab:4583): GLib-GObject-CRITICAL **: g_signal_emit_valist: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

(PCollab:4583): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed PCollab: Fatal IO error 11 (Resource temporarily unavailable) on X server :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)

最佳答案

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 和指针?

关于c++ - 运行 Gtkmm 对话框失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com