为什么Gtk.Widget.set_size_请求和Gtk.Window.set_default_size会导致具有相同值的不同窗口大小?

为什么Gtk.Widget.set_size_请求和Gtk.Window.set_default_size会导致具有相同值的不同窗口大小?,gtk,gtk3,vala,Gtk,Gtk3,Vala,为什么在DrawingArea小部件(也使用Gtk.Button测试)上调用set_size_request(800600)会生成一个大小为958 x 791 px的窗口,而在窗口上调用set_default_size(800600)会生成一个大小合适的窗口(通过截屏并查看其分辨率来衡量)?如果由于窗口标题栏的原因,高度会有一点差异,我会理解,但是宽度和高度的差异对我来说没有意义。文档中没有任何类似的提示。如果有人能启发我,那就太好了 下面是一个用vala编写的代码示例: using Gtk;

为什么在DrawingArea小部件(也使用Gtk.Button测试)上调用set_size_request(800600)会生成一个大小为958 x 791 px的窗口,而在窗口上调用set_default_size(800600)会生成一个大小合适的窗口(通过截屏并查看其分辨率来衡量)?如果由于窗口标题栏的原因,高度会有一点差异,我会理解,但是宽度和高度的差异对我来说没有意义。文档中没有任何类似的提示。如果有人能启发我,那就太好了

下面是一个用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;
    }
}
@张宗仁,谢谢你的测试。我又试了一次,像你一样把它分成两个应用程序。这两扇窗户的大小对我来说完全不同。我在我的两台显示器上都试过了——同样的东西


顺便说一句,我使用的是基本操作系统0.4.1 Loki,安装的libgtk-3-0版本是3.18.9。

从评论中,您似乎已经检查了大小是否相同,但将其转换为实际答案

让我们添加一个信号来通知窗口大小:

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
)运行测试应用程序将输出:

窗::尺寸(px)宽度:800高度:600

不过,使用
Gtk.Window时,使用
Gtk.Widget.set_size_request
将不允许小部件小于给定大小(因此
Gtk.Window
),而使用
Gtk.Window.set_default_size
将允许窗口“缩小”到初始大小以下

从API:

  • :

    设置窗口的默认大小

    如果窗口的“自然”大小(其大小请求)大于 默认值,默认值将被忽略。更一般地说,如果默认 大小不符合窗口的几何图形提示( set_geometry_提示可用于显式设置),默认设置为 尺寸将夹紧至最接近的允许尺寸

    与set_size_request不同,set_size_request为小部件和 这样可以防止用户缩小窗口,仅此功能 设置初始大小,就像用户调整了窗口大小一样 他们自己。用户仍然可以像往常一样缩小窗口 将将默认大小设置为-1意味着使用“自然”默认值 大小(窗口的大小请求)

  • :

    设置小部件的最小大小;即,小部件的大小请求 宽度和高度至少相等

    您可以使用此函数强制小部件比它大 通常是这样

    在大多数情况下,对于toplevel,设置默认大小是更好的选择 窗口比此功能;设置默认大小仍将允许 用户可以缩小窗口。设置大小请求将强制它们 使窗口至少与大小请求一样大。什么时候 处理窗口大小时,set_geometry_提示可能是一个有用的函数 还有

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

    小部件的大小请求是小部件可以接受的最小大小 同时仍能正常工作并正确绘制自身。然而在 在某些奇怪的情况下,小部件的分配可能少于其请求的分配 在许多情况下,小部件可能会被分配比它更多的空间 请求。。。此处设置的大小请求不包括任何边距 从窗口小部件属性的左边距、右边距、上边距和 边距底部,但它确实包括几乎所有其他填充或 控件的任何子类设置的边框属性


AFAIK Gtk不会对窗户的初始尺寸做出任何承诺;如果未设置初始大小或任何几何图形提示,则初始大小可以是任意大小。这可能取决于你的窗口管理器。但最让我困惑的是800x600像素(屏幕上的实际物理像素,对吧?!)似乎与窗口和绘图区域不同。当设置为窗口的默认大小时,它的屏幕截图正好具有该分辨率。另一方面,当我将其设置为DrawingArea的大小时,由799599绘制的正方形在右下角可见,而0,0处的对象位于左上角。当然,窗口大小可以调整,以适应绘图区域,但现在窗口在两个方向上都比原来大150像素。@Rawing我想我已经解决了!你是对的,设置一个窗口的默认大小并不能保证它真的显示该大小。谢谢你的提示!虽然不同的默认窗口大小会导致不同的实际大小,但这一直在愚弄我。它的尺寸从来都不合适。屏幕截图工具更是愚弄了我;打开Gimp中的屏幕截图,我意识到窗口周围有一个透明的空间。它必须以某种方式获取默认大小,获取窗口的屏幕截图,然后使分配给窗口但未被窗口使用的空间透明。