Gtk.DrawingArea пусто при подключении к Gtk.Grid

(Это мой первый пост, извините, если я что-то не так делаю...)

Я пишу программу на Вала, с помощью которой можно создать классную комнату. Я решил использовать GTK для GUI (Vala хорошо интегрируется с этим) и Cairo для рисования диаграммы классной комнаты (GTK поставляется с этим по умолчанию).

Я создал класс 'classroom' (подкласс 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и просто добавить мой classroom с помощью root.add() (который я прокомментировал), classroom Виджет отображается правильно:

Когда это работает, без использования Gtk.Grid

Почему мой виджет не отображается при добавлении с помощью Gtk.Grid?

Что я могу сделать, чтобы это исправить?

1 ответ

Решение

Проблема в том, что ячейка имеет размер 0x0 пикселей, потому что сетка не знает, сколько места на самом деле нужно вашей области рисования.

Простое решение - просто запросить фиксированный размер, попробуйте это:

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

PS: я получил эту идею, посмотрев на другие подобные вопросы по SO, особенно этот.

Другие вопросы по тегам