gtkmm-4.0和glibmm-2.68中的变更。

gtkmm-4.0是gtkmm API的新版本。它可以与较早发行的gtkmm-2.4和gtkmm-3.0并行安装。gtkmm-3.0 API的最新版本是gtkmm 3.24。gtkmm 4与gtkmm 3没有根本性的区别,虽然有些变更但是保持了二进制兼容。如果你从未使用过gtkmm-3.0 API则你可以放心的忽略本章。

gtkmm 4库调用libgtkmm-4.0而不是libgtkmm-3.0,并将其的头文件安装于类似的目录下,所以你的pkg-config应该检索gtkmm-4.0而不是gtkmm-3.0

gtkmm-4.0与glibmm-2.68结合使用,将设置程序的全局语言环境。较旧的glibmm-2.4不会这样做,而gtkmm-3.0只在一定程度上做到了。简而言之,如果你的gtkmm-3.0应用包含了对std::locale::global(std::locale(""))的调用,则你大概率可以直接将其删除。如果你不希望glibmm或者gtkmm为你设置程序的全局语言环境,则应该在调用任何Glib::init()函数或Gtk::Application::create()方法之前添加对Glib::set_init_to_users_preferred_locale(false)的调用。

参考

gtkmm-3.0和gtkmm-4.0之间有很多不同之处。以下是不完整的列表。

gtkmm 4和glibmm 2.68中添加了一些新的类:

  1. Glib::ExtraClassInitGtk::Snapshot:这些类只用于编写自定义的窗口小部件。参见自定义部件小节。

  2. Gtk::EventControllerKey, Gtk::EventControllerMotion, Gtk::EventControllerScrollGtk::GestureStylus

  3. Gdk::Paintable, Gdk::Texture, Gtk::PictureGtk::WidgetPaintable

  4. Gdk::Window被重命名为Gdk::Surface(Gtk::Window名称保持不变)。

  5. 新添加了Gdk::DrawContextGdk::CairoContextGdk::DrawingContext已被删除。

  6. Gtk::Clipboard被新的Gdk::Clipboard替换。

  7. Gdk::DragContext现在被拆分为Gdk::DragGdk::Drop

API也进行了一些更改,在移植gtkmm-3.0和glibmm-2.4代码时你可能会遇到这些更改。以下是一个简短的变更列表:

  1. 需要支持C++17的编译器

  2. Gtk::ButtonGtk::ToolButtonGtk::MenuItemGtk::Switch 实现了Gtk::Actionable接口而不是已被删除的Gtk::Activatable接口。

  3. Gtk::FontButton实现了Gtk::FontChooser接口。

  4. Gtk::Widgetget_preferred_*_vfunc()方法已被measure_vfunc()方法替代。此变更只影响自定义部件。

  5. sigc::slot使用sigc::slot<R(Args...)>语法。 例如: sigc::slot<void(int, int)>而不是使用sigc::slot<void, int, int>

  6. Gtk::DrawingArea使用绘制函数替代绘制信号。

  7. Glib::ArrayHandle, Glib::StringArrayHandle, Glib::ListHandleGlib::SListHandle已被删除。他们曾在glibmm-2.4中被使用,而gtkmm-3.0并未使用他们。如果你曾经使用过他们,则将他们替换为标准C++容器,例如std::vector

  8. Gtk::Container已被删除。

  9. Gtk::Widget::show_all()已被删除。Gtk::Widget::property_visible()的默认值从false改为true

  10. Gtk::Widget上的所有事件信号均已被删除。 大多数时候你可以使用Gtk::EventController的子类之一进行替换。例如, 使用Gtk::GestureMultiPress替代signal_button_press_event()以及signal_button_release_event(),使用Gtk::EventControllerKey替代signal_key_press_event()signal_key_release_event()

  11. Glib::RefPtrstd::shared_ptr的别名。如果你使用返回Glib::RefPtrcreate()方法用以创建派生自Glib::ObjectBase的类,则你必须在你的create()方法中调用Glib::make_refptr_for_instance()

  12. Gtk::Box::pack_start()Gtk::Box::pack_end()已被删除。现在Gtk::Box使用新的append()prepend()insert_child_after()insert_child_at_start()方法。

  13. Gtk::ButtonBox已被删除

  14. Gtk::RadioButtonGtk::RadioButtonGroup已被删除。改为使用Gtk::CheckButton或者是Gtk::ToggleButtonset_group()

gtkmmglibmm 2.68移除了所有之前标记为弃用的API,未来还会有新的API被标记为弃用。

将源代码移植到gtkmm-4.0的第一步,通过定义GTKMM_DISABLE_DEPRECATED,GDKMM_DISABLE_DEPRECATED,GLIBMM_DISABLE_DEPRECATED和GIOMM_DISABLE_DEPRECATED宏禁用所有在gtkmm-3.0和glibmm-2.4中弃用的API,有一些autotools宏可以帮助你在编译时定义他们。更多有关详情请参见从gtkmm-2.4迁移到gtkmm-3.0Wiki页面。

另请参见从GTK3.X迁移到GTK 4