首页 > 解决方案 > gtk_container_add:断言“GTK_IS_WIDGET(小部件)”失败

问题描述

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);
    }
}

我编译时显示以下错误, 在此处输入图像描述

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

只有当您看到时才会显示标题栏。

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

标签: gtkgtk3vala

解决方案


preferences_stack.add (preferences_view);
preferences_stack.add (main_view);

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


推荐阅读