2012-04-20 42 views
1

最近,我开始了一个C++项目,以便用GTK函数熟练掌握自己的技能。我用C++的方法,因为我总是用java编程,所以在我看来很熟悉。以优雅和礼貌的方式在C++中处理GTK回调

现在,GTK库是用C代码编写的,所以我在类和C代码风格之间实现了一些混合。我的问题之一是GTK事件与回调函数一起工作。为了将这些事件封装在类中,我使用了静态方法。

重要的是静态方法和静态变量在类内部是不可见的,再加上我写了一些其他的静态函数,只在类的.cpp文件中声明,从回调中调用但完全与班级分开。

在我看来,这种方法有点笨拙,所以我想知道是否有任何最好的方法来处理类中的回调,并允许它们以优雅的方式与类方法和结构进行交互?

谢谢!

+0

@JoachimPileborg:我建议你发表您的评论作为一个写回信呃。 – wilx 2012-04-20 07:46:04

回答

6

是的,你需要在user_data参数中传递状态(比如你指向这个指针,或者指向某个slot/functor的指针)。否则,你永远不会有一个类实例来调用你的成员方法。

这就是gtkmm所做的。例如,GTK ::容器::的foreach()采用的是静态的(非成员)函数,传递一个提供sigc ::插槽,: http://git.gnome.org/browse/gtkmm/tree/gtk/src/container.ccg#n166

的信号代码(调用的事件在你的问题是什么)是相似的,但稍微复杂一点 - 你可以在gtkmm中看到生成的.cc代码。

但是,我也认为你应该只使用gtkmm。这只是你最终会解决问题的几个问题之一。

+0

有趣的是,我的一个项目使用'gtkmm'和另一个C++库,但后者有C风格的回调,所以我必须通过userdata去那里。让我更加欣赏'gtkmm' :-)感谢所有关于它的工作。我喜欢C的GTK +,但是不能用C++来使用它,所以如果不是'gtkmm',我可能不得不寻找另一个工具包 - 从而失去了GTK提供的所​​有酷东西。 – 2015-12-06 00:59:13

3

我建议你看看Gtkmm

2

作为旁注,GTK库是用C,但也有绑定到从其它语言使用它们:

  • C++→gtkmm的
  • 蟒→PyGTK的(对于GTK2),pyGObject(对于GTK3 )
  • 的Java→Java的侏儒