В чем разница между Gtk :: Main и Gtk :: Application :: create? - PullRequest
0 голосов
/ 15 мая 2018

Оба создают окна Gtk, но я не могу понять, что происходит за кулисами. Я пытался привязать сигнал к кнопке, чтобы выйти из окна, но программа получила SIGSEGV при использовании Gtk::Application::create. Когда я изменил программу, чтобы следовать Gtk::Main соглашения. Все работало нормально.

Gtk::Application::create программа (не работает):

auto app = Gtk::Application::create(argc, argv);
Gtk::Button *button = new Gtk::Button("Quit");
button->signal_clicked().connect(sigc::ptr_fun(Gtk::Main::quit));
Gtk::Window window;
window.set_default_size(200, 200);
window.add(*button);
button->show();
return app->run(window);

Gtk::Main программа (работает):

auto app = Gtk::Main(argc, argv);
Gtk::Button *button = new Gtk::Button("Quit");
button->signal_clicked().connect(sigc::ptr_fun(app.quit));
Gtk::Window window;
window.set_default_size(200, 200);
window.add(*button);
button->show();
app.run(window);
return 0;

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Почему не работает

Первый код получает SIGSEGV, потому что вы вызываете static Gtk :: Main :: quit при использовании Gtk :: Application .

Возможно, вы могли бы использовать sigc :: mem_fun для вызова Gio :: Application :: quit , унаследованного в Gtk::Application, но это не очень хорошая идея при использовании Gtk: Применение :: Run (Gtk :: Window &)

Если вы вызываете Gio :: Application :: quit (), когда окно подключено к приложению, а затем возвращаетесь из main (), не удаляя окно из приложения, деструктор приложения не будет называется.

И, честно говоря, я не знаю как, потому что Glib :: RefPtr , возвращаемый Gtk :: Application :: create () не может получить объект:

В отличие от большинства других интеллектуальных указателей, RefPtr не поддерживает разыменование через * object_ptr.

Вместо этого закройте окно

С Gtk :: Application :: add_window (Gtk :: Window &) :

Если все окна, управляемые Gtk :: Application, закрыты (скрыты) или удалены из приложения, то вызов функции run () вернется.

#include <gtkmm.h>

int main()
{
    auto app = Gtk::Application::create();
    Gtk::Button *button = new Gtk::Button("Quit");
    Gtk::Window window;
    button->signal_clicked().connect(sigc::mem_fun(&window, &Gtk::Window::close));

    window.set_default_size(200, 200);
    window.add(*button);
    window.show_all(); //for some widgets (I don't remember which) show() is not enough
    return app->run(window);
}
0 голосов
/ 17 мая 2018

Без информации о конкретной ошибке трудно понять, в чем проблема на самом деле.Однако я вижу, что у вас нет идентификатора приложения.См. этот пример .Вы также можете проверить this , чтобы узнать больше об идентификаторах приложений.

По сути, я бы попробовал что-то вроде:

int main(int argc, char** argv)
{
    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
                                              //    ^^^^^^^^^^^^^^^^^^^ <- add something like this (see below)
    Gtk::Button *button = new Gtk::Button("Quit");
    button->signal_clicked().connect(sigc::ptr_fun(Gtk::Main::quit));
    Gtk::Window window;
    window.set_default_size(200, 200);
    window.add(*button);
    button->show();
    return app->run(window);
}

Обратите внимание, что вы можете (и должны) изменитьидентификатор приложения для ваших собственных нужд.Внимательно прочитайте вторую ссылку, чтобы ознакомиться с соглашением, и тщательно выберите свой идентификатор.

Надеюсь, это поможет!

...