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() не была распознана компилятором.

Другие вопросы по тегам