2017-09-07 4 views
1

Warum ruft set_size_request (800,600) DrawingArea widget (auch getestet mit Gtk.Button) in einem Fenster der Größe 958 x 791 px, während set_default_size (800,600) für das Fenster in einem entsprechend großen Fenster (wie gemessen mit einen Screenshot von nur dem Fenster zu machen und seine Auflösung zu betrachten)? Ich würde verstehen, wenn es wegen der Fenster-Header-Leiste eine kleine Diskrepanz in der Höhe geben würde, aber solch ein Unterschied in der Breite und Höhe macht keinen Sinn für mich. Die Dokumentation deutet nichts dergleichen an. Wenn mich jemand aufklären könnte, wäre das großartig!Warum ergeben Gtk.Widget.set_size_request und Gtk.Window.set_default_size unterschiedliche Fenstergrößen mit gleichen Werten?

Hier ist ein Codebeispiel in Vala geschrieben:

using Gtk; 
using Cairo; 

public class SizeTest : Gtk.Window { 

    public SizeTest() { 
     this.title = "Size test"; 
     this.destroy.connect (Gtk.main_quit); 
     //set_default_size (800, 600); // Window size -> 800 x 600 px 

     var drawing_area = new DrawingArea(); 
     drawing_area.set_size_request (800, 600); // Window size -> 958 x 791 px 
     add (drawing_area); 
    } 

    static int main (string[] args) { 
     Gtk.init (ref args); 

     var test = new SizeTest(); 
     test.show_all(); 

     Gtk.main(); 

     return 0; 
    } 
} 

@Zongren Zhang, wir danken Ihnen für sie zu testen. Ich habe es erneut versucht und es in zwei Anwendungen aufgeteilt, wie Sie es getan haben. Die Größe beider Fenster ist für mich ziemlich unterschiedlich. Ich habe es auf meinen beiden Monitoren versucht - das gleiche.

Btw, ich benutze elementare OS 0.4.1 Loki, installiert libgtk-3-0-Version ist 3.18.9.

+0

AFAIK Gtk machen keine Versprechungen über eine Anfangsgröße der Fenster; Wenn Sie keine Anfangsgröße oder Geometrietipps festlegen, kann die Anfangsgröße beliebig sein. Es hängt wahrscheinlich von Ihrem Fenstermanager ab. –

+0

Aber was verwirrt mich am meisten ist, dass 800x600 px (was tatsächliche physische Pixel auf dem Bildschirm ist, richtig ?!) scheint etwas anders als das Fenster als in der DrawingArea. Wenn es als Standardgröße des Fensters eingestellt ist, hat ein Screenshot davon genau diese Auflösung. Wenn ich es andererseits als die Größe des DrawingArea einstelle, wird ein Quadrat, das 799,599 gezeichnet wird, gerade in der unteren rechten Ecke sichtbar, während ein Objekt bei 0,0 in der oberen linken Ecke liegt. Die Fenstergröße passt sich natürlich an, um die DrawingArea aufzunehmen, aber das Fenster ist jetzt mehr als 150 px in beiden Richtungen größer. – Heiko

+0

@Rawing Ich denke, ich habe es herausgefunden! Du hattest recht, wenn du die Standardgröße eines Fensters einstellst, ist das keine Garantie dafür, dass es wirklich mit dieser Größe auftaucht. Danke für den Hinweis! Obwohl verschiedene Standardfenstergrößen zu unterschiedlichen tatsächlichen Größen führen, habe ich mich täuschen lassen. Es war nie die richtige Größe. Das Screenshot Tool hat mich noch weiter getäuscht; D. Als ich die Screenshots in Gimp öffnete, erkannte ich, dass um das Fenster herum ein transparenter Raum ist. Es muss irgendwie diese Standardgröße holen, einen Screenshot des Fensters machen und dann den Raum machen, der dem Fenster zugewiesen wurde, aber nicht transparent verwendet wird. – Heiko

Antwort

1

Aus den Kommentaren scheint es, dass Sie bereits überprüft haben, dass die Größe gleich ist, aber dies zu einer tatsächlichen Antwort übersetzt.

Läßt ein Signal fügen Sie uns von der Fenstergröße zu informieren:

this.configure_event.connect ((event) => { 
    print ("Window::Size (px) Width: %d Height: %d\n", event.width, event.height); 
    return false; 
}); 

Der resultierende Code wird sein:

using Gtk; 

public class SizeTest : Gtk.Window { 

    public SizeTest() { 
     this.title = "Size test"; 
     this.destroy.connect (Gtk.main_quit); 
     this.configure_event.connect ((event) => { 
      print ("Window::Size (px) Width: %d Height: %d\n", event.width, event.height); 
      return false; 
     }); 
     set_default_size (800, 600); // Window size -> 800 x 600 px 

     var drawing_area = new DrawingArea(); 
     //drawing_area.set_size_request (800, 600); // Window size -> 800 x 600 px 
     add (drawing_area); 
    } 

    static int main (string[] args) { 
     Gtk.init (ref args); 

     var test = new SizeTest(); 
     test.show_all(); 

     Gtk.main(); 

     return 0; 
    } 
} 

Ausführen die Testanwendung eine der beiden Optionen (Gtk.Widget.set_default_size vs Gtk.Window.set_default_size) unter Verwendung von wird ausgegeben:

Fenster :: Größe (px) Breite: 800 Höhe: 600

Es gibt einen Unterschied aber, Gtk.Widget.set_size_request verwendet, wird das Widget, um kleiner als die angegebenen Größe (und die Gtk.Window als Folge) nicht zulassen, dass während Gtk.Window.set_default_size verwendet, wird das Fenster erlauben, unter der ursprünglichen Größe „schrumpfen“.

Von der API:

  • Gtk.Widget.set_default_size:

    Legt die Standardgröße eines Fensters. Wenn die "natürliche" Größe des Fensters (seine Größenanforderung) größer ist als die Standardeinstellung, wird der Standardwert ignoriert. Wenn die Standardgröße nicht den Geometrie-Hinweisen für das Fenster entspricht ( set_geometry_hints kann verwendet werden, um diese explizit festzulegen), wird die Standardgröße auf die nächste zulässige Größe geklammert.

    Im Gegensatz zu set_size_request, die eine Größe Anfrage für ein Widget setzt und damit Benutzer halten würde das Fenster schrumpft, ist diese Funktion nur setzt die Anfangsgröße, wie, wenn der Benutzer das Fenster sich der Größe verändert hatte. Benutzer können das Fenster immer noch verkleinern, wie es normalerweise würde.Das Festlegen einer Standardgröße von -1 bedeutet, dass die "natürliche" Standardgröße (die Größenanforderung des Fensters) verwendet wird.

  • Gtk.Widget.set_size_request:

    Legt die Mindestgröße eines Widgets; Das heißt, die Größenanforderung des Widgets wird mindestens Breite nach Höhe sein.

    Sie können diese Funktion verwenden, um ein Widget zu erzwingen, das größer ist als normalerweise .

    In den meisten Fällen ist set_default_size eine bessere Wahl für Toplevel Windows als diese Funktion; Wenn Sie die Standardgröße festlegen, können Benutzer weiterhin das Fenster verkleinern. Wenn Sie die Größenanforderung eingeben, wird das Fenster gezwungen, das Fenster mindestens so groß wie die Größenanforderung zu verlassen. Wenn Umgang mit Fenstergrößen, kann set_geometry_hints eine nützliche Funktion sein auch.

    Beachten Sie die inhärente Gefahr der Festlegung einer festen Größe - Themen, Übersetzungen in andere Sprachen, verschiedene Schriftarten und Benutzeraktion können alle die geeignete Größe für ein bestimmtes Widget ändern. Also ist es grundsätzlich unmöglich, eine Größe zu kodieren, die immer korrekt ist.

    Die Größenanforderung eines Widgets ist die kleinste Größe, die ein Widget akzeptieren kann, während es immer noch gut funktioniert und sich korrekt zeichnet. Jedoch in einige seltsame Fälle ein Widget kann weniger als die angeforderte Größe zugeordnet werden, und in vielen Fällen ein Widget kann mehr Speicherplatz zugewiesen werden als es angefordert. ... Die hier eingestellte Größenanforderung enthält keinen Rand aus den Widget-Eigenschaften Rand links, Rand rechts, Rand oben und Rand unten, aber es enthält so ziemlich alle anderen Füll- oder Randeigenschaften von jeder Unterklasse von Widget.

Verwandte Themen