如何解决gtkmm:无法创建 Gtk::Switch
使用 Gtkmm 2.24.5,我尝试使用以下代码创建一个带有单个 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
从类定义中删除开关后,程序运行良好,返回一个空窗口。这里有什么问题?
解决方法
问题是,我使用的是 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
类的新最小工作示例如下所示:
#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);
}
现在按预期编译和运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。