gtk_container_add:断言“GTK_IS_WIDGET(小部件)”失败

Posted

技术标签:

【中文标题】gtk_container_add:断言“GTK_IS_WIDGET(小部件)”失败【英文标题】:gtk_container_add: assertion 'GTK_IS_WIDGET (widget)' failed 【发布时间】:2021-03-27 08:53:30 【问题描述】:
public class Epoch.MainWindow : Gtk.ApplicationWindow 
    private Gtk.Grid grid;
    
    private Epoch.LabelsGrid labels;
    private Epoch.PreferencesView preferences_view;
    private Epoch.MainView main_view;
    
    public MainWindow (Application app) 
        Object (
            application: app,
            icon_name: "com.github.Suzie97.epoch",
            resizable: false,
            title: _("Epoch"),
            width_request: 500
        );
    
    
    construct 
        get_style_context ().add_class ("rounded");
        set_keep_below (true);
        stick ();
        
        var preferences_button = new Gtk.Button.from_icon_name ("open-menu-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
        preferences_button.valign = Gtk.Align.CENTER;
        
        var preferences_stack = new Gtk.Stack ();
        preferences_stack.add (preferences_view);
        preferences_stack.add (main_view);
        preferences_stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT;
        
        var headerbar = new Gtk.HeaderBar ();
        headerbar.show_close_button = true;
        
        var headerbar_style_context = headerbar.get_style_context ();
        headerbar_style_context.add_class ("default-decoration");
        headerbar_style_context.add_class (Gtk.STYLE_CLASS_FLAT);
        
        headerbar.pack_end (preferences_button);
        
        set_titlebar (headerbar);
        
        var main_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
        main_box.pack_start (preferences_stack, true, true);
        add (main_box);
        
        show_all ();
        
        preferences_view = new Epoch.PreferencesView ();
        
        preferences_button.activate.connect (() => 
                preferences_stack.visible_child = preferences_view;
        );
        
    //     public override bool configure_event (Gdk.EventConfigure event) 
    //     int root_x, root_y;
    //     get_position (out root_x, out root_y);
    //     Epoch.settings.set_int ("window-x", root_x);
    //     Epoch.settings.set_int ("window-y", root_y);

    //     return base.configure_event (event);
    

编译时显示如下错误,

我希望应用程序在单击标题栏右侧的按钮时切换到首选项视图,

只有在你看到的时候才会显示标题栏。

为什么会这样?我该如何解决?

【问题讨论】:

【参考方案1】:
preferences_stack.add (preferences_view);
preferences_stack.add (main_view);

你还没有初始化preferences_view,你也从来没有初始化main_view。这就是您的第二个和第三个错误的来源:gtk_container_add() 抱怨您尝试添加的小部件实际上不是小部件,而是 null,因为您尚未初始化该变量。

【讨论】:

以上是关于gtk_container_add:断言“GTK_IS_WIDGET(小部件)”失败的主要内容,如果未能解决你的问题,请参考以下文章

xubuntu 21.10 g++ gtk4“错误:‘gtk_container_add’未在此范围内声明”

如何将 GTK2 像素图移植到 GTK3_

gtk窗口和标签控件范例代码

在 GTK 中使用多线程?

Python终端自动补全

如何在Mac系统中安装R的rattle包