c++ - gtkmm 的 g_signal_emit 或 g_signal_emit_by_name 版本是什么?

标签 c++ signals gtk3 gtkmm

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

// 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;
}
}

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

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;

最佳答案

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

关于c++ - gtkmm 的 g_signal_emit 或 g_signal_emit_by_name 版本是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783839/

相关文章:

c++ - 创建指向更多 vector 的指针 vector

c++ - Qt Creator 添加 mqtt 库

c - waitpid 在不应该的时候阻塞

c++ - 如何在没有 if-else 的情况下无限循环或循环到极限

signals - 如何处理或检测 D 中的系统信号?

python - python中信号处理程序的执行上下文

c - 如何将 pdf 文件作为背景导入 GtkDrawingArea

valgrind - 带有 GTK 的 GUI 有几个内存泄漏

rust - 让GtkComboBox条目为Pixbuf或String

c++ - "error: ' A ' cannot be overloaded",但代码中没有任何重载