GTK :: main :: run segfaults

Я пытаюсь написать программу GTK. Мне удалось заставить мое окно порождаться с кнопкой в ​​нем, но теперь, когда я пытаюсь упаковать коробку и добавить 2 кнопки к коробке, я segfault. Что меня смущает, так это то, что при создании GTK :: Main :: run не происходит segfault, а наоборот.

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

Решение

Gtk::Main устарела и заменена Gtk::Application, теперь он обрабатывает цикл обработки событий.

Это работает, если вместо Gtk::Main::run(mainWindow); ты используешь app->run(mainWindow);
лайк ergosys сказал.

Для правильной очистки, вы, вероятно, должны позвонить app->quit() вместо libc quit()тоже (или просто закройте окно, которое также завершит основной цикл)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]