2

次のように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(); ですべて失敗します。さらに楽しくするために、次の 2 つのエラーのいずれかが表示されます。

(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: 致命的な IO エラー 11 (リソースが一時的に利用できません) が X サーバー :0.0 で発生しました。

だから私は一体何を考えて走った

須藤 xhost +

これは、同じプログラムが X11 に 2 回接続できる魔法のようなものです (または、すべてを知っているインターネットで読んだものです)。これにはある程度の効果がありますが、私が望むものではありません。今では、はるかに不可解なものが得られるからです。

../../src/xcb_io.c: process_responses: Assertion `(((long) (dpy->last_request_read) - (long)(dpy->request)) <= 0)' failed.

最初のエラーは、gtk によってオブジェクトと見なされないため、mw が Gtk::Window を指していないことを意味すると思いますが、Gtk を実行すると mw がエラーなしで画面に完全に表示されるという事実は残ります。 ::メイン ginit(*mw); これが何を意味するのか、私にはまったくわからないので、Gtk / X11 の第一人者が私のコードを修正する正しい方向に向けてくれることを願っています。

その他の詳細、gcc 4.4.5 および gtkmm 2.4 で Ubuntu Linux (amd64) を実行しています

4

2 に答える 2

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とポインタの代わりに?

于 2011-10-06T14:30:52.140 に答える
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 --------^
于 2012-01-11T14:20:31.610 に答える