【问题标题】:What would be gtkmm's version of g_signal_emit or g_signal_emit_by_name?gtkmm 的 g_signal_emit 或 g_signal_emit_by_name 版本是什么?
【发布时间】:2015-05-01 06:33:07
【问题描述】:

我在我的程序后台运行一个超时函数,我试图从 Gtk::Button 发出一个删除事件信号,这是我构造函数中的代码 sn-p:

// Glib::SignalProxy1<bool,GdkEventAny*> m_deleteSlot;
// m_deleteSlot =
signal_delete_event().connect (sigc::mem_fun (*this, &AlarmUI::my_delete_event));
m_timeout_connection = Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &AlarmUI::cb_my_tick), 1);`

现在,方法:

bool AlarmUI::my_delete_event (GdkEventAny *event) {
if (m_timeout_connection.connected ()) {
    // show messagebox here
    return true;
} else {
    // bye bye
    return false;
}
}

现在,当用户单击退出按钮时,我想发出删除事件信号。问题:如何在 gtkmmm 中像在 C g_signal_emit 或 g_signal_emit_by_name 中一样发出信号?

void AlarmUI::on_button_quit () {
// m_deleteSlot.emit (); ???
}

更新1:

Glib::RefPtr<Gtk::Application> app = Gtk::Application::create (argc, argv, PACKAGE);
Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create ();
try { 
    refBuilder->add_from_file (UI_PATH);
}
catch (const Glib::FileError& ex) {
    std::cout << "FileError: " << ex.what() << std::endl;
    return 1;
}
catch (const Gtk::BuilderError& ex) {
    std::cout << "BuilderError: " << ex.what() << std::endl;
    return 1;
}
catch(const Glib::MarkupError& ex)
{
    std::cout << "MarkupError: " << ex.what() << std::endl;
    return 1;
}
AlarmUI *ui = 0;
refBuilder->get_widget_derived ("window1", ui);
if (ui) {
    ui->show_all ();
    app->run (); // The window doesn't show
}
delete ui;

【问题讨论】:

    标签: c++ signals gtk3 gtkmm


    【解决方案1】:

    从小部件外部发出小部件信号通常是不明智的。这会干扰小部件实现的内部结构。如果你想隐藏窗口,你可以调用 thewindow.hide() ,如果你想销毁它,你可以删除它。或者您可以通过发出 delete-event 信号直接执行您想要间接触发的任何其他操作。

    【讨论】:

    • 隐藏意味着破坏..我想真正隐藏窗口。此外,我试图更直观(正确的词?),但调用从“X”按钮(窗口管理器)关闭窗口触发的相同事件
    • hide() 并不意味着破坏。如果只是隐藏窗口来隐藏窗口,您的代码会更直观(也更安全)。
    • 如果我使用 WindowUI.hide(),应用程序会关闭并退出,这不是隐藏 :(
    • 可能是因为你使用的是 Gtk::Application::run(window) 或 Gtk::Main::run(window)。为了方便起见,它们旨在在该主窗口关闭时停止程序。但是您可以在不指定窗口的情况下调用这些 run() 方法并调用 Gio::Application::quit() 或 Gtk::Main::Quit()。
    • 对不起,是的,如果 Gtk::Application::run() 没有任何打开的窗口,它会返回。 run(window) 是将窗口添加到 Gtk::Application 的最简单方法(不使用 Gtk::Appication::add_window())。如果你想在隐藏窗口后做某事,你应该在 run() 返回之后再做。窗口还没有被破坏。只有当你让你的 main() 返回时,程序才会退出。
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2013-11-25
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多