gtk_container_add: 断言 'GTK_IS_WIDGET (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);
    }
}

我编译时显示如下错误

enter image description here

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

enter image description here

仅当您看到时才显示标题栏。

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

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...