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

在gtkmm-3.0中如何使用Gtk::Widget::add_tick_callback调用on_tick函数

解决gtkmm-3.0中Gtk::Widget::add_tick_callback的使用问题

问题核心

你遇到的编译错误根源有两个:

  • 自定义的on_tick函数签名与SlotTick的要求不匹配
  • 没有正确绑定类成员函数到sigc::slot

SlotTick的定义明确要求可调用对象必须接收const Glib::RefPtr<Gdk::FrameClock>&作为参数,并返回bool,而你的原on_tick没有参数,直接导致类型不兼容。

修正方案

步骤1:修正on_tick函数签名

将on_tick的参数改为const Glib::RefPtr<Gdk::FrameClock>&,完全匹配SlotTick的要求。

步骤2:正确绑定成员函数到sigc::slot

对于类成员函数,需要使用sigc::mem_fun绑定对象实例与成员函数,或者用C++11及以上的lambda表达式实现更简洁的写法。

完整可运行代码

方式1:使用sigc::mem_fun绑定

#include <gtkmm.h>

class MainWindow : public Gtk::Window {
public:
  MainWindow() {
    // 绑定当前对象实例与on_tick成员函数,生成符合要求的slot
    add_tick_callback(sigc::mem_fun(*this, &MainWindow::on_tick));
  }
protected:
  // 修正后的函数签名,完全匹配SlotTick定义
  bool on_tick(const Glib::RefPtr<Gdk::FrameClock>& frame_clock) {
    // 这里编写每帧需要执行的逻辑
    // 示例:打印当前帧的时间戳
    g_print("当前帧时间:%lld\n", frame_clock->get_frame_time());
    
    // 返回true表示继续接收后续tick回调,返回false则停止
    return true;
  }
};

int main(int argc, char* argv[]) {
  Glib::RefPtr<Gtk::Application> app = 
    Gtk::Application::create(argc, argv, "org.sample.minimumreproducible");

  MainWindow mainWindow;
  
  return app->run(mainWindow);
}

方式2:使用lambda表达式(C++11+)

lambda写法更直观,适合快速构造slot:

#include <gtkmm.h>

class MainWindow : public Gtk::Window {
public:
  MainWindow() {
    // 用lambda包裹成员函数调用,自动适配slot类型
    add_tick_callback([this](const Glib::RefPtr<Gdk::FrameClock>& frame_clock) {
      return this->on_tick(frame_clock);
    });
  }
protected:
  bool on_tick(const Glib::RefPtr<Gdk::FrameClock>& frame_clock) {
    // 执行每帧逻辑
    return true;
  }
};

int main(int argc, char* argv[]) {
  Glib::RefPtr<Gtk::Application> app = 
    Gtk::Application::create(argc, argv, "org.sample.minimumreproducible");

  MainWindow mainWindow;
  
  return app->run(mainWindow);
}

关键说明

  • 返回值:on_tick返回true时,GTK会持续触发每帧回调;返回false则会自动移除该回调,停止执行。
  • Gdk::FrameClock参数:可以通过它获取帧时间、刷新率等信息,用于动画同步或性能监控。

内容的提问来源于stack exchange,提问作者livphi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:55:29