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?
Что я могу сделать, чтобы это исправить?
1 ответ
Проблема в том, что ячейка имеет размер 0x0 пикселей, потому что сетка не знает, сколько места на самом деле нужно вашей области рисования.
Простое решение - просто запросить фиксированный размер, попробуйте это:
var classroom = new Classroom();
classroom.set_size_request (40, 40);
PS: я получил эту идею, посмотрев на другие подобные вопросы по SO, особенно этот.