GTK :: main ::运行segfaults

时间:2012-12-08 02:25:54

标签: c++ segmentation-fault gtkmm

我正在尝试编写GTK程序。我设法让我的窗口生成一个按钮,但是现在当我尝试打包一个盒子并在盒子中添加2个按钮时,我就是段错误。让我感到困惑的是,当我创建任何东西时它不会出现段错误,但是当我运行GTK :: Main :: run时,它会出现问题。

int main(int argc, char *argv[])
{
    Glib::RefPtr<Gtk::Application> app =
    Gtk::Application::create(argc, argv,
    "org.gtkmm.examples.base");

    MainWindow mainWindow;
    cout << "trying to run window"<< endl;
    Gtk::Main::run(mainWindow);
    cout << "done running window"<< endl;
    return 0;
 }

MainWindow::MainWindow()
:quit_button("Quit"),
write_button("Write"),
window_box()
{
set_border_width(10);
quit_button.signal_clicked().connect(sigc::mem_fun(*this,
    &MainWindow::quit_button_clicked));
write_button.signal_clicked().connect(sigc::mem_fun(*this,
    &MainWindow::write_button_clicked));
window_box.start_pack(quit_button);
window_box.start_pack(write_button);
add(window_box);
write_button.show();
quit_button.show();
window_box.show();
}

MainWindow::~MainWindow()
{

}

void MainWindow::write_button_clicked()
{
    std::cout << "Hello World" << std::endl;
}
void MainWindow::quit_button_clicked()
{
    exit(0);
}

是我的主要方法和我的MainWindow类的构造函数。我试过不包装任何东西或包装更少的东西,我仍然是段错误。我是GTK的新手,所以我知道我一定会错过一些简单的东西。

编辑:主窗口声明

#include <gtkmm.h>
#include <iostream>

using namespace std;

class MainWindow : public Gtk::Window
{
public:
    MainWindow();
    ~MainWindow();

protected:
//Signal Handlers
 void   write_button_clicked();
 void   quit_button_clicked();


//Widgets
 Gtk::Button quit_button;
 Gtk::Button write_button;
 Gtk::VBox window_box;asd

};
#endif // GTKMM_EXAMPLE_HELLOWORLD_H

1 个答案:

答案 0 :(得分:1)

Gtk::Main已被弃用并由Gtk::Application取代,它现在处理事件循环。

如果您使用Gtk::Main::run(mainWindow);代替app->run(mainWindow);,它就有效 就像ergosys所说的那样。

为了正确清理,您可能应该调用app->quit()而不是libc的quit()(或者只关闭窗口,这也将终止主循环)