首页 > 解决方案 > 单击按钮后添加元素

问题描述

我试图通过编写一个非常简单的应用程序来学习 Vala,但我偶然发现了一个我无法自己解决的问题。

该程序仅显示一个按钮Init,单击时应将 Button 添加X到 Grid 容器。不幸的是,Grid 容器的内容仍然是空的,我不知道为什么。

更令人困惑的是,在构造函数中添加 Button 可以按预期工作。

那么我在这里做错了什么?

using Gtk;

class MyWindow: Gtk.Window {
    private Gtk.Grid mGrid;

    public MyWindow() {
        var init=new Gtk.Button.with_label("Init");
        init.clicked.connect((t)=>{
            stdout.printf("Init");
            mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
        });
        var box=new Gtk.Box(VERTICAL,0);
        mGrid=new Gtk.Grid();
        //mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
        box.add(init);
        box.add(mGrid);
        this.add(box);
        this.show_all();
    }
}

int main(string[] args) {
    Gtk.init(ref args);
    new MyWindow();
    Gtk.main();
    return 0;
}

标签: gtkgtk3valagnome-builder

解决方案


使用 GTK+ 工具包,小部件默认是隐藏的。尽管您有this.show_all (),但该按钮是在之后创建的并且是隐藏的。从以下位置更改回调:

init.clicked.connect((t)=>{
  stdout.printf("Init");
  mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
});

类似于:

init.clicked.connect((t)=>{
  stdout.printf("Init");
  var my_button = new Gtk.Button.with_label("X");
  my_button.show_all ();
  mGrid.attach(my_button,0,0,1,1);
});

现在工作。


推荐阅读