Gtkmm 3/C++, закрытие программы кнопкой вместо окна "X"
Все.
Я работаю над приложением gtkmm и мне нужна помощь, чтобы заставить работать кнопку "Закрыть". Как предложено в документации gtkmm, я извлек класс для объекта главного окна, создал несколько членов и оставил функцию main() в основном для чтения файла интерфейса пользователя glade, создания экземпляра формы и запуска основного цикла.
Есть 3 файла, которые удобно называть для объяснения: Declarations.h, Declarations.cpp, Program.cpp
В "Declarations.h" у меня есть класс, унаследованный от окна Gtk:
#include <gtkmm.h>
class MainWindowClass : public Gtk::ApplicationWindow
{
protected:
Gtk::Button *button_close;
// other buttons here
protected:
void on_button_close_clicked();
// other callback functions here
public:
MainWindowClass(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &refGlade); // Constructor
// Destructor, other public members
};
В "Declarations.cpp" у меня есть реализации:
#include "Declarations.h"
using namespace Gtk;
// Implementing the constructor
MainWindowClass::MainWindowClass(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &refGlade) :
Gtk::Window(cobject), builder(refGlade)
{
builder->get_widget("button_close", button_close);
// Getting other widgets from the glade file
button_close->signal_clicked().connect(sigc::mem_fun(*this, &MainWindowClass::on_button_close_clicked));
// Connecting other callback functions here
}
// Implementing the callback for the "Close" button, ** PROBLEM IS HERE **
void MainWindowClass::on_button_close_clicked()
{
//gtk_main_quit(); Apparently GTK+/C only, compiler doesn't complain but causes a segfault when clicking the button
//Gtk::Application::quit(); Won't compile
}
Program.cpp читает пользовательский интерфейс из файла и запускает основной цикл программы:
#include <gtkmm.h>
#include "Declarations.h"
int main(int argc, char *argv[])
{
auto app = Gtk::Application::create(argc, argv, "Damn this close button");
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("Program_UI.glade");
MainWindowClass our_main_window;
return app->run(our_main_window);
}
Я опускаю некоторый нерелевантный код (других объектов и обратных вызовов), потому что они работают, это закрывающая процедура, которая вызывает у меня проблемы, хотя закрытие приложения с "X" работает. Я также думал о попытке вызвать функцию quit() или destroy() (если они существуют) "app", но функция обратного вызова не знает, что "app" существует. Что вы, ребята, предлагаете?
Большое спасибо.
** Редактировать: исправлено это с помощью FormMain::hide(), который унаследован от GtkWindow. Я думал, что статическая процедура Gtk::Main::hide() сделает это, но компилятор говорит, что hide () не является членом Gtk::Main... Что ж, двигаться вперед по одному шагу за раз.
1 ответ
Используется FormMain::hide() (унаследовано от GtkWindow). Статическая процедура Gtk::Main::hide() не была распознана компилятором.