【问题标题】:gtkmm: Cannot create Gtk::Switchgtkmm: 无法创建 Gtk::Switch
【发布时间】:2021-07-14 09:28:02
【问题描述】:

使用 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 版本?
  • std::cout &lt;&lt; GTKMM_MAJOR_VERSION &lt;&lt; "." &lt;&lt; GTKMM_MINOR_VERSION &lt;&lt; "." &lt;&lt; GTKMM_MICRO_VERSIONl; 给出 2.24.5
  • 看来Gtk::Switchintroduced in Gtkmm 3.0。您的应用程序甚至将其作为成员变量构建,这很奇怪。

标签: c++ gtk gtkmm


【解决方案1】:

问题是,我使用的是 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);
}

现在按预期编译和运行。

【讨论】:

  • 请考虑接受您的回答以供其他用户查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多