【问题标题】:Why does Gtk.Widget.set_size_request and Gtk.Window.set_default_size result in different Window sizes with same values?为什么 Gtk.Widget.set_size_request 和 Gtk.Window.set_default_size 会导致具有相同值的不同窗口大小?
【发布时间】:2017-09-07 22:26:07
【问题描述】:

为什么在 DrawingArea 小部件上调用 set_size_request(800,600)(也使用 Gtk.Button 测试)会产生大小为 958 x 791 像素的窗口,而在窗口上调用 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,感谢您的测试。我又试了一次,把它分成两个应用程序,就像你做的那样。两个窗口的大小对我来说完全不同。我在我的两台显示器上都试过了——同样的事情。

顺便说一句,我使用的是elementary OS 0.4.1 Loki,安装的libgtk-3-0版本是3.18.9。​​

【问题讨论】:

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

标签: gtk gtk3 vala


【解决方案1】:

从 cmets 看来,您似乎已经检查过大小是否相同,但会将其转换为实际答案。

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

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_sizeGtk.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 不同,set_size_request 设置小部件的大小请求,并且 因此将阻止用户缩小窗口,此功能仅 设置初始大小,就像用户调整了窗口大小一样 他们自己。用户仍然可以像往常一样再次缩小窗口 将。将默认大小设置为 -1 意味着使用“自然”默认值 size(窗口的大小请求)。

  • Gtk.Widget.set_size_request:

    设置小部件的最小尺寸;也就是widget的size请求 至少是宽乘高。

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

    在大多数情况下,set_default_size 是顶层的更好选择 windows比这个功能;设置默认大小仍然允许 用户缩小窗口。设置大小请求将强制他们 使窗口至少与请求的大小一样大。什么时候 处理窗口大小,set_geometry_hints 可能是一个有用的功能 也是。

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

    小部件的尺寸请求是小部件可以接受的最小尺寸 同时仍然运行良好并正确绘制自己。然而在 一些奇怪的情况下,小部件的分配可能少于其请求 大小,并且在许多情况下,小部件可能会被分配比它更多的空间 请求。 ... 这里设置的尺寸要求不包括任何边距 来自 Widget 属性 margin-left、margin-right、margin-top 和 边距底部,但它确实包括几乎所有其他填充或 由 Widget 的任何子类设置的边框属性。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2017-07-24
    • 2018-03-24
    • 2016-10-27
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多