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);
}
现在可以按预期编译和运行了。
使用 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);
}
现在可以按预期编译和运行了。