2

(初投稿です、間違っていたらすみません…)

私はValaで教室をデザインできるプログラムを書いています。GUI には GTK を使用し (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追加するだけで、ウィジェットは正しく表示されます。classroomroot.add()classroom

Gtk.Gridを使用せずに動作する場合

Gtk.Grid を使用してウィジェットを追加すると、ウィジェットが表示されないのはなぜですか?

これを修正するにはどうすればよいですか?

4

1 に答える 1

2

問題は、セルのサイズが 0x0 ピクセルであることです。これは、グリッドが描画領域に実際に必要なスペースを認識していないためです。

簡単な解決策は、固定サイズをリクエストすることです。これを試してください:

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

PS: SO に関する他の同様の質問、特にthis oneを見て、このアイデアを得ました。

于 2016-11-24T09:45:27.133 に答える