gtkmm4:在 Gtk::HeaderBar 中时,Gtk::Button 点击​​信号不会触发

Posted

技术标签:

【中文标题】gtkmm4:在 Gtk::HeaderBar 中时,Gtk::Button 点击​​信号不会触发【英文标题】:gtkmm4: Gtk::Button click signal doesn't fire when in Gtk::HeaderBar 【发布时间】:2021-12-27 19:52:56 【问题描述】:

我正在使用 gtkmm4。我有一个 Gtk::Window、Gtk::Button 和 Gtk::HeaderBar。我已将 Button 打包到 HeaderBar 的末尾,然后将 Window 的标题栏设置为标题栏。我的代码如下所示:

class Window: public Gtk::ApplicationWindow


public:
    
    Window()
        Gtk::Box box;
        Gtk::HeaderBar bar;
        Gtk::Button button"Test Button";

        button.signal_clicked().connect(sigc::mem_fun(*this, &Window::on_button_pressed));

        set_titlebar(bar);
        set_child(button);
    ;

private:
    void on_button_pressed()
    
        std::cout << "Button clicked!" << std::endl;
    ;
;

由于某种原因,当我点击它时,按钮的点击信号没有激活,而我期望它会激活。我在这里做错了什么吗?提前谢谢!

【问题讨论】:

非常抱歉!仔细观察,您似乎是对的。我也不确定我是如何显示小部件的,我猜是 Gtkmm4 的一个怪癖,但谢谢!您可以重新发布您的原始解决方案,不便之处请见谅。我仍然不确定 why 将其添加到标题栏并将其设置为窗口的子项会更改信号的处理方式,但我想给将来可能成为我的人的教训,将所有小部件添加到窗口作为成员。 【参考方案1】:

根据你的例子,当你写的时候:

Gtk::Button button"Test Button";

button 变量是 local 并在 Window 构造函数结束时消失。为避免这种情况,您有两种选择:

    Make 是 Window 类成员。 使用Gtk::make_managed 允许Window 自动处理其子按钮的生命周期。

我很惊讶你竟然看到了这些小部件......我怀疑真正的代码是不同的......

【讨论】:

以上是关于gtkmm4:在 Gtk::HeaderBar 中时,Gtk::Button 点击​​信号不会触发的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 lambda 函数中设置按钮标签时出现分段错误

在 Maven 中,如何在版本中命名战争文件与在快照构建中不同

存储在 plist 中的数据在模拟器中有效,但在设备中无效

在 C 中声明 == 在 C++ 中定义? [复制]

初始化发生在哪里,在 init 方法中还是在实例声明中?

查询在数据库中花费了更多时间,尽管在连接条件中使用了索引列,那么我们可以在代码中做些啥来优化