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

标签 gtk gtk3 vala

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

顺便说一句,我使用的是基本操作系统 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 )运行测试应用程序将输出:

Window::Size (px) Width: 800 Height: 600



但是有区别,使用 Gtk.Widget.set_size_request使用 Gtk.Window 时,将不允许小部件小于给定的大小(因此是 Gtk.Window.set_default_size)将允许窗口“缩小”到初始大小以下。

从API:
  • Gtk.Widget.set_default_size :

    Sets the default size of a window.

    If the window’s “natural” size (its size request) is larger than the default, the default will be ignored. More generally, if the default size does not obey the geometry hints for the window ( set_geometry_hints can be used to set these explicitly), the default size will be clamped to the nearest permitted size.

    Unlike set_size_request, which sets a size request for a widget and thus would keep users from shrinking the window, this function only sets the initial size, just as if the user had resized the window themselves. Users can still shrink the window again as they normally would. Setting a default size of -1 means to use the “natural” default size (the size request of the window).

  • Gtk.Widget.set_size_request :

    Sets the minimum size of a widget; that is, the widget’s size request will be at least width by height.

    You can use this function to force a widget to be larger than it normally would be.

    In most cases, set_default_size is a better choice for toplevel windows than this function; setting the default size will still allow users to shrink the window. Setting the size request will force them to leave the window at least as large as the size request. When dealing with window sizes, set_geometry_hints can be a useful function as well.

    Note the inherent danger of setting any fixed size - themes, translations into other languages, different fonts, and user action can all change the appropriate size for a given widget. So, it's basically impossible to hardcode a size that will always be correct.

    The size request of a widget is the smallest size a widget can accept while still functioning well and drawing itself correctly. However in some strange cases a widget may be allocated less than its requested size, and in many cases a widget may be allocated more space than it requested. ... The size request set here does not include any margin from the Widget properties margin-left, margin-right, margin-top, and margin-bottom, but it does include pretty much all other padding or border properties set by any subclass of Widget.

  • 关于gtk - 为什么 Gtk.Widget.set_size_request 和 Gtk.Window.set_default_size 导致具有相同值的不同窗口大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46105973/

    相关文章:

    python - 在 PyGObject 中设置样式属性

    ubuntu - 编译 Synapse 项目时出错

    oop - 非 Objective-C 语言中 'receiver' 的等效术语

    c - 如何修复 "Gtk-WARNING ** Content added to the action area of a dialog using header bars"

    c - 如何获取激活行的数据 GTK+ C

    x11 - 如何使用 Gdk.X11.Window 在 Vala 中获取窗口 xid?

    c++ - 转换 GLib/GTK 指针是未定义的行为吗?

    position - 如何使用gdk_device_get_position()?

    c - GtkApplication 和 gtk_init 有什么区别?

    C:使用 GTk+ 跟踪鼠标移动