为什么Gtk.Widget.set_size_request和Gtk.Window.set_default_size导致具有相同值的不同Window大小?

时间:2017-09-07 22:26:08

标签: gtk gtk3 vala

为什么在DrawingArea小部件(也使用Gtk.Button测试)上调用set_size_request(800,600)会导致窗口大小为958 x 791 px,而在窗口上调用set_default_size(800,600)会导致窗口大小合适(如测量的那样)通过截取窗口的截图并查看它的分辨率)?我会理解,由于窗户标题栏,高度会有一点差异,但宽度和高度的这种差异对我来说没有意义。文档没有提示任何类似的东西。如果有人能够启发我,那就太好了!

这是用vala编写的代码示例:

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,谢谢你的测试。我再试一次,将它分成两个应用程序,就像你一样。两个窗口的大小对我来说是完全不同的。我在我的两台显示器上都试过了 - 同样的事情。

Btw,我使用的是基本的OS 0.4.1 Loki,安装的libgtk-3-0版本是3.18.9。​​

1 个答案:

答案 0 :(得分:1)

从评论中看来,您已经检查过大小是否相同,但将其转换为实际答案。

让我们添加一个信号告诉我们窗口大小:

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

结果代码为:

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;
    }
}

使用以下任一选项(Gtk.Widget.set_default_size vs Gtk.Window.set_default_size)运行测试应用程序将输出:

  

Window :: Size(px)宽度:800高度:600

虽然存在差异,但使用Gtk.Widget.set_size_request将不允许小部件小于给定大小(因此Gtk.Window),而使用Gtk.Window.set_default_size将允许窗口收缩"收缩"低于初始大小。

来自API:

  • Gtk.Widget.set_default_size

      

    设置窗口的默认大小。

         

    如果窗口的“自然”大小(其大小请求)大于   默认情况下,将忽略默认值。更一般地说,如果是默认值   大小不遵守窗口的几何提示(   set_geometry_hints可用于显式设置这些,默认值   尺寸将被钳制到最接近的允许尺寸。

         

    与set_size_request不同,后者为小部件设置大小请求   因此会阻止用户缩小窗口,仅此功能   设置初始大小,就像用户调整窗口大小一样   他们自己。用户仍然可以像往常一样再次缩小窗口   将。将默认大小设置为-1表示使用“自然”默认值   size(窗口的大小请求)。

  • Gtk.Widget.set_size_request

      

    设置小部件的最小大小;也就是小部件的大小请求   至少是高度宽度。

         

    您可以使用此功能强制小部件比它大   通常是。

         

    在大多数情况下,set_default_size是顶级的更好选择   窗口比这个功能;设置默认大小仍然允许   用户缩小窗口。设置大小请求将强制它们   离开窗口至少与尺寸要求一样大。什么时候   处理窗口大小时,set_geometry_hints可以是一个有用的函数   同样。

         

    注意设置任何固定大小的固有危险 - 主题,   翻译成其他语言,不同的字体和用户操作   都可以更改给定小部件的适当大小。所以,它   基本上不可能硬编码总是正确的大小。

         

    窗口小部件的大小请求是窗口小部件可以接受的最小大小   虽然仍然运作良好,并正确绘制自己。然而在   一些奇怪的情况,小部件的分配可能少于其请求   大小,并且在许多情况下,小部件可能被分配比它更多的空间   请求。 ...此处设置的大小请求不包含任何保证金   从Widget属性margin-left,margin-right,margin-top和   margin-bottom,但它确实包括几乎所有其他填充或   由Widget的任何子类设置的边框属性。