2

(这是我的第一篇文章,如果我做错了对不起......)

我正在 Vala 编写一个可以设计教室的程序。我决定使用 GTK 作为 GUI(Vala 与此很好地集成),并使用 Cairo 绘制教室图(GTK 默认带有此)。

我创建了一个“教室”类(Gtk.DrawingArea 的子类),目前应该只显示一个正方形:

public class Classroom : DrawingArea
{
    private delegate void DrawMethod();

    public Classroom()
    {
        this.draw.connect((widget, context) => {
            return draw_class(widget, context, context.stroke);
            });
    }

    bool draw_class(Widget widget, Context context, DrawMethod draw_method)
    {
        context.set_source_rgb(0, 0, 0);
        context.set_line_width(8);
        context.set_line_join (LineJoin.ROUND);

        context.save();

        context.new_path();
        context.move_to(10, 10);
        context.line_to(30, 10);
        context.line_to(30, 30);
        context.line_to(10, 30);
        context.line_to(10, 10);
        context.close_path();

        draw_method();  // Actually draw the lines in the buffer to the widget

        context.restore();

        return true;
    }
}

我还为我的应用程序创建了一个类:

public class SeatingPlanApp : Gtk.Application
{
    protected override void activate ()
    {
        var root = new Gtk.ApplicationWindow(this);
        root.title = "Seating Plan";
        root.set_border_width(12);
        root.destroy.connect(Gtk.main_quit);

        var grid = new Gtk.Grid();
        root.add(grid);

        /* Make our classroom area */
        var classroom = new Classroom();
        grid.attach(classroom, 0, 0, 1, 1);
        //root.add(classroom);

        root.show_all();
    }

    public SeatingPlanApp()
    {
        Object(application_id : "com.github.albert-tomanek.SeatingPlan");
    }
}

这是我的主要功能:

int main (string[] args)
{
    return new SeatingPlanApp().run(args);
}

我将我的classroom小部件放入Gtk.Grid我选择的布局小部件中。当我编译我的代码并运行它时,我得到一个空白窗口:

我的空白窗口

但是,如果我不使用Gtk.Grid,而只是添加我的classroomusing root.add()(我已将其注释掉),则classroom小部件将正确显示:

当它工作时,不使用 Gtk.Grid

为什么我的小部件在使用 Gtk.Grid 添加时不显示?

我能做些什么来解决这个问题?

4

1 回答 1

2

问题是单元格的大小为 0x0 像素,因为网格不知道您的绘图区域实际需要多少空间。

一个简单的解决方案是只请求一些固定大小,试试这个:

var classroom = new Classroom();
classroom.set_size_request (40, 40);

PS:我是通过查看关于 SO 的其他类似问题得到这个想法的,尤其是这个

于 2016-11-24T09:45:27.133 回答