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中添加了一些新的类:
Glib::ExtraClassInit和Gtk::Snapshot:这些类只用于编写自定义的窗口小部件。参见自定义部件小节。
Gtk::EventControllerKey, Gtk::EventControllerMotion, Gtk::EventControllerScroll和Gtk::GestureStylus
Gdk::Paintable, Gdk::Texture, Gtk::Picture和Gtk::WidgetPaintable
Gdk::Window被重命名为Gdk::Surface(Gtk::Window名称保持不变)。
新添加了Gdk::DrawContext和Gdk::CairoContext。Gdk::DrawingContext已被删除。
Gtk::Clipboard被新的Gdk::Clipboard替换。
Gdk::DragContext现在被拆分为Gdk::Drag和Gdk::Drop。
API也进行了一些更改,在移植gtkmm-3.0和glibmm-2.4代码时你可能会遇到这些更改。以下是一个简短的变更列表:
需要支持C++17的编译器
Gtk::Button,Gtk::ToolButton,Gtk::MenuItem和Gtk::Switch 实现了Gtk::Actionable接口而不是已被删除的Gtk::Activatable接口。
Gtk::FontButton实现了Gtk::FontChooser接口。
Gtk::Widget:get_preferred_*_vfunc()方法已被measure_vfunc()方法替代。此变更只影响自定义部件。
sigc::slot使用sigc::slot<R(Args...)>语法。 例如: sigc::slot<void(int, int)>而不是使用sigc::slot<void, int, int>。
Gtk::DrawingArea使用绘制函数替代绘制信号。
Glib::ArrayHandle, Glib::StringArrayHandle, Glib::ListHandle和Glib::SListHandle已被删除。他们曾在glibmm-2.4中被使用,而gtkmm-3.0并未使用他们。如果你曾经使用过他们,则将他们替换为标准C++容器,例如std::vector。
Gtk::Container已被删除。
Gtk::Widget::show_all()已被删除。Gtk::Widget::property_visible()的默认值从false改为true。
Gtk::Widget上的所有事件信号均已被删除。 大多数时候你可以使用Gtk::EventController的子类之一进行替换。例如, 使用Gtk::GestureMultiPress替代signal_button_press_event()以及signal_button_release_event(),使用Gtk::EventControllerKey替代signal_key_press_event()和signal_key_release_event()。
Glib::RefPtr是std::shared_ptr的别名。如果你使用返回Glib::RefPtr的create()方法用以创建派生自Glib::ObjectBase的类,则你必须在你的create()方法中调用Glib::make_refptr_for_instance()。
Gtk::Box::pack_start()和Gtk::Box::pack_end()已被删除。现在Gtk::Box使用新的append(),prepend(),insert_child_after()和insert_child_at_start()方法。
Gtk::ButtonBox已被删除
Gtk::RadioButton和Gtk::RadioButtonGroup已被删除。改为使用Gtk::CheckButton或者是Gtk::ToggleButton的set_group()。
gtkmm和glibmm 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。