gtkmm:无法创建 Gtk::Switch

gtkmm: Cannot create Gtk::Switch

使用 Gtkmm 2.24.5,我尝试使用以下代码创建一个 window 和单个 Gtk::Switch

#include <gtkmm.h>
#include <gtkmm/switch.h>

class SimpleWindow : public Gtk::Window
{
public:
    SimpleWindow();
private:
    Gtk::VBox m_VBox;
    Gtk::Switch m_Switch;
};

SimpleWindow::SimpleWindow()
{
    set_title("Simple");
    add(m_VBox);
    // Todo: Setup switch
    show_all();
}

int main(int argc, char** argv)
{
    Gtk::Main kit(argc, argv);
    SimpleWindow simple;
    kit.run(simple);
    return 0;
}

尝试 运行 代码时,我收到以下警告和错误:

GLib-GObject-WARNING **: 11:21:22.896: cannot register existing type 'GtkWidget'
GLib-GObject-WARNING **: 11:21:22.896: cannot add class private field to invalid type '<invalid>' 
GLib-GObject-WARNING **: 11:21:22.896: cannot add private field to invalid (non-instantiatable) type '<invalid>' 
GLib-GObject-CRITICAL **: 11:21:22.896: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed 
GLib-GObject-WARNING **: 11:21:22.896: cannot register existing type 'GtkBuildable' 
GLib-GObject-CRITICAL **: 11:21:22.896: g_type_interface_add_prerequisite: assertion 'G_TYPE_IS_INTERFACE (interface_type)' failed 
GLib-CRITICAL **: 11:21:22.896: g_once_init_leave: assertion 'result != 0' failed

从 class 定义中删除开关后,程序 运行 正常,返回空 window。这里有什么问题?

问题是,我使用的是 gtkmm 2.24.5,而 Gtk::Switch 是在 gtkmm 3.0 中引入的。不知何故,我的 pkg-config eclipse 插件还包含 gtkmm 4.0,因此 gtkmm/switch.h 的显式包含防止了 m_Switch 声明处的编译器错误。

使用 gtkmm 4.0 切换到干净的项目 Gtk:Switch class 的新的最低工作示例如下所示:

#include <gtkmm.h>

class SimpleWindow : public Gtk::Window
{
public:
    SimpleWindow();
private:
    Gtk::Switch m_Switch;
};

SimpleWindow::SimpleWindow()
{
    set_title("Simple");
    m_Switch.set_margin(20);
    set_child(m_Switch);
}

int main(int argc, char** argv)
{
    auto app = Gtk::Application::create("org.gtkmm.example");
    return app->make_window_and_run<SimpleWindow>(argc, argv);
}

现在可以按预期编译和运行了。