You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:00:53