从gtkmm-3.0迁移至4.0:如何替代GdkEventButton获取按钮点击信息
在gtkmm 4.0中获取按钮点击的光标坐标与点击类型
gtkmm 4.0对GDK事件系统做了面向对象重构,原C风格的GdkEventButton结构体被替换为Glib::RefPtr<Gdk::EventButton>智能指针类型,信号连接与事件信息获取方式也相应调整。以下是迁移后的完整示例:
核心代码示例
1. 槽函数定义
#include <gtkmm.h> #include <iostream> bool on_button_press(const Glib::RefPtr<Gdk::EventButton>& event);
2. 信号连接
int main(int argc, char* argv[]) { auto app = Gtk::Application::create("org.example.ButtonClick"); Gtk::Window window; window.set_title("Button Click Test"); Gtk::Button button("点击我"); window.set_child(button); // 连接按钮点击事件信号 button.signal_button_press_event().connect(sigc::ptr_fun(&on_button_press)); return app->run(window); }
3. 槽函数实现(获取坐标与点击类型)
bool on_button_press(const Glib::RefPtr<Gdk::EventButton>& event) { // 获取相对于窗口的本地坐标 const double win_x = event->get_x(); const double win_y = event->get_y(); // 获取全局屏幕坐标 const double root_x = event->get_x_root(); const double root_y = event->get_y_root(); // 获取点击的按键类型 const Gdk::ButtonType btn_type = event->get_button(); // 输出信息示例 std::cout << "本地坐标(窗口): " << win_x << ", " << win_y << "\n"; std::cout << "全局坐标(屏幕): " << root_x << ", " << root_y << "\n"; std::cout << "点击类型: "; switch(btn_type) { case Gdk::BUTTON_PRIMARY: std::cout << "左键"; break; case Gdk::BUTTON_SECONDARY: std::cout << "右键"; break; case Gdk::BUTTON_MIDDLE: std::cout << "中键"; break; default: std::cout << "未知按键(" << btn_type << ")"; break; } std::cout << "\n"; // 返回true表示事件已处理,阻止后续传递;返回false则允许事件继续传播 return true; }
关键说明
- 事件对象:使用
Glib::RefPtr<Gdk::EventButton>替代原GdkEventButton*,无需手动管理内存 - 坐标获取:
get_x()/get_y():获取事件发生位置相对于窗口的坐标get_x_root()/get_y_root():获取事件发生位置相对于全局屏幕的坐标- 如果需要相对于按钮自身的坐标,可以结合按钮的
get_allocation()计算(比如event->get_x() - button.get_allocation().get_x())
- 点击类型:通过
get_button()获取对应Gdk::ButtonType枚举值,直接判断左键、右键或中键
内容的提问来源于stack exchange,提问作者alschei
相关产品推荐
相关产品推荐

