两者都创建了 Gtk 窗口,但我真的无法理解幕后发生了什么。我尝试将信号绑定到按钮以退出窗口,但程序在使用Gtk::Application::create
时得到了 SIGSEGV。当我更改程序以遵循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;
为什么它不起作用
第一个代码得到 SIGSEGV,因为你在使用 Gtk::Application 时调用静态 Gtk::Main::quit。
你可能使用 sigc::mem_fun 来调用 Gio::Application::quit 继承Gtk::Application
,但在使用 Gtk::Application::run(Gtk::Window&( 时,这不是一个好主意:
如果在窗口连接到应用程序时调用 Gio::Application::quit((,然后从 main(( 返回而不删除 窗口,应用程序的析构函数将不是 叫。
老实说,我不知道怎么做,因为 Gtk::Application::create(( 返回的 Glib::RefPtr 没有办法获取对象:
与大多数其他智能指针不同,RefPtr 不支持通过 * object_ptr取消引用。
改为关闭窗口
From 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);
}
由于没有关于特定错误的信息,很难知道问题到底是什么。我看到的一件事是你没有应用程序ID。请参阅此示例。您还可以查看此信息以了解有关应用程序 ID 的更多信息。
基本上,我会尝试这样的事情:
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);
}
请注意,您可以(并且应该(根据自己的需要更改应用程序 ID。仔细阅读第二个链接以查看约定并仔细选择您的 ID。
希望这有帮助!