1

两者都创建 Gtk 窗口,但我无法真正理解幕后发生的事情。我尝试将信号绑定到按钮以退出窗口,但程序在使用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;
4

2 回答 2

3

为什么它不起作用

第一个代码获得 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 取消引用。

而是关闭窗口

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);
}
于 2018-06-14T14:11:22.260 回答
0

由于没有关于具体错误的信息,很难知道问题到底是什么。我看到的一件事是您没有应用程序 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。

希望这可以帮助!

于 2018-05-17T00:15:47.050 回答