2016-11-23 8 views
1

에 부착 할 때 (이것은 내 첫 번째 게시물, 내가 뭔가 잘못 ... 할 미안 경우) 하나가 교실을 설계 할 수있는Gtk.DrawingArea의 빈 Gtk.Grid

내가 발라에서 프로그램을 작성하고 있습니다. 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"); 
    } 
} 

그리고 이것은 내 주요 기능입니다 : 내 0123을 넣어

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

위젯을 Gtk.Grid에, 내 레이아웃 위젯을 선택하십시오. 내 코드를 컴파일하고 실행하면 , 나는 빈 창이 얻을 : 나는 Gtk.Grid를 사용하고, 단지 추가하지 않을 경우, 그러나

My blank window

을 내 classroomroot.add() (내가 주석이있는)의를 사용하여 classroom 위젯이 제대로 표시됩니다 Gtk.Grid를 사용하여 추가 할 때

When it works, without using Gtk.Grid

왜 내 위젯은 표시되지 않습니다?

이 문제를 해결하려면 어떻게해야합니까?

+0

안녕하세요. 오신 것을 환영합니다. 질문은 괜찮 았습니다. 나는 약간의 편집을했다 (이미지를 인라인하고 "감사"부분을 제거했다. 여기서는 불필요하다고 여긴다). –

+0

단 하나의 사소한 일 : 모든 코드를'.vala' 파일에 복사하고 컴파일하려고했지만'Gtk 사용하기'및'Cairo;'지시어를 사용하지 않았습니다. 다음 번에 모든 코드를 모든 코드를 단일 코드 블록에 넣는 것을 고려해야합니다. –

+0

필자는 개인적으로'using' 지시어를 전혀 좋아하지 않습니다. 모든 유형은 전체 네임 스페이스 (GLib 네임 스페이스와 내 클래스가 들어있는 네임 스페이스 제외) 만 있으면됩니다. –

답변

1

문제는 그리드 영역에 실제로 필요한 공간이 모눈에 표시되지 않기 때문에 셀 크기가 0x0 픽셀입니다.

간단한 해결책은 그냥 고정 된 크기를 요청하는 것입니다,이 시도 :

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

PS를 : 나는 SO, 특히 this one에 다른 유사한 질문을보고이 아이디어를 얻었다.

+1

더 나은 해결책은 위젯을 확장/정렬하도록 설정하는 것입니다. [this] (https://developer.gnome.org/gtk3/stable/ch30s02.html)를 참조하십시오. 보다 나은 해결책은 있지만 GtkDrawingArea를 서브 클래스 화하고'get_preferred_width()'와'get_preferred_height()'메소드를 오버라이드하여 크기 *가 무엇인지를 리턴하는 것입니다. – andlabs