1

最近我开始了一个 C++ 项目,以便让自己熟练使用 GTK 函数。我使用了 C++ 方法,因为我总是用 java 编程,所以对我来说似乎很熟悉。

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

最重要的是静态方法和静态变量在类内部是不可见的,另外我还编写了一些其他静态函数,仅在类的 .cpp 文件中声明,从回调内部调用但与类完全分离.

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

谢谢!

4

3 回答 3

6

是的,您需要在 user_data 参数中传递状态(例如,您的 this 指针,或指向某个插槽/函子的指针)。否则,您将永远不会有一个类实例来调用您的成员方法。

这就是 gtkmm 所做的。例如,Gtk::Container::foreach() 使用静态(非成员)函数,将提供的 sigc::slot 传递给它: http ://git.gnome.org/browse/gtkmm/tree/gtk/src /container.ccg#n166

信号的代码(您在问题中称为事件)类似,但稍微复杂一些 - 您可以在 gtkmm 中生成的 .cc 代码中看到它。

但是,我也认为你应该只使用 gtkmm。这只是您最终(不)自己解决的几个问题之一。

于 2012-04-20T09:15:12.400 回答
3

我建议您改为查看Gtkmm

于 2012-04-20T07:48:45.543 回答
2

作为旁注,GTK 库是用 C 编写的,但是有一些绑定可以从其他语言中使用它们:

  • C++ → GTKmm
  • python → pyGTK(用于 GTK2),pyGObject(用于 GTK3)
  • Java → java-gnome

等等

于 2012-04-20T10:04:34.567 回答