如何在 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,所以没法试。
我对 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,所以没法试。