2016-11-23 31 views
1

(这是我的第一篇文章,如果对不起,我做错了什么......)Gtk.DrawingArea空当连接到Gtk.Grid

我在瓦拉写一个程序,使用它可以设计一个教室。 我决定使用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,这是我选择的布局小部件。 当我编译我的代码并运行它,我得到了一个空白窗口:

My blank window

但是,如果我不使用Gtk.Grid,只是加我classroom使用root.add()(我注释掉)时, classroom小部件正确显示:

When it works, without using Gtk.Grid

为什么使用Gtk.Grid加入时我的小工具显示不出来?

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

+0

欢迎来到SO,你的问题相当好。我做了一些编辑(内联图像并删除了“感谢”部分,这在这里被认为是不必要的)。 –

+0

虽然有一件小事:我将所有代码复制到'.vala'文件并尝试编译,但是缺少'使用Gtk;'和'使用Cairo;'指令。下一次您应该考虑将所有必要指令的所有代码放在一个代码块中。 –

+0

就我个人而言,我不喜欢''使用'指令,我只是使用它的完整名称空间来限定每个类型(GLib名称空间和我自己的类所在的名称空间除外)。 –

回答

1

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

一个简单的解决方法就是请一些固定的大小,试试这个:

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

PS:我通过SO,特别this one寻找其他类似的问题得到了这个想法。

+1

更好的解决方案是将widget设置为展开/对齐,参见[this](https://developer.gnome.org/gtk3/stable/ch30s02.html)。一个更好的解决方案,但更困难的是,将子类GtkDrawingArea并覆盖get_preferred_width()和get_preferred_height()方法来返回size *应该是的大小。 – andlabs