如何在 gtkmm C++ 中以编程方式注入按钮按下之类的事件?

How to inject an event like button press programmatically in gtkmm C++?

我对 C++ gtkmm (Linux) 编程还很陌生。我开发了一个程序,我需要在 gui 上另一个按钮的回调函数中单击一个按钮。 我试过了 button.activate() 但它只对按钮点击进行动画处理,但不会调用回调函数。当我手动点击按钮时,回调函数被调用。 请解释如何将事件注入 gtkmm C++ 编码。事件可能包括按下按钮、按下按键等。

这是一个使用 Gtkmm 3.24 的按钮点击示例:

#include <iostream>
#include <gtkmm.h>

class MainWindow : public Gtk::ApplicationWindow
{

public:

    MainWindow();

private:

    Gtk::Grid m_layout;

    Gtk::Label m_label;

    Gtk::Button m_buttonA;
    Gtk::Button m_buttonB;

};

MainWindow::MainWindow()
: m_buttonA{"A"}
, m_buttonB{"B"}
{
    m_label.set_text("Click a button...");

    m_buttonA.signal_clicked().connect(
        [this](){
            std::cout << "Button A clicked!" << std::endl;

            // Emits "clicked" on button B, just like when
            // a user clicks it:
            m_buttonB.clicked();
            m_buttonB.activate_action("clicked");
        }
    );

    m_buttonB.signal_clicked().connect(
        [this](){
            std::cout << "Button B clicked!" << std::endl;
        }
    );

    m_layout.attach(m_buttonA, 0, 0, 1, 1);
    m_layout.attach(m_buttonB, 1, 0, 1, 1);

    add(m_layout);
}

int main(int argc, char *argv[])
{
    std::cout << "Gtkmm version : " << gtk_get_major_version() << "."
                                    << gtk_get_minor_version() << "."
                                    << gtk_get_micro_version() << std::endl;

    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
  
    MainWindow window;
    window.show_all();
  
    return app->run(window);
}

然而,对于 Gtkmm 4,clicked() 方法似乎已从 Gtk::Button 的界面中删除。通过查看新界面,有一个 activate_action 方法(继承自 Gtk::Widget)也许可以工作。但是,我这里没有Gtkmm 4,所以没法试。