Почему Gtk.Widget.set_size_request и Gtk.Window.set_default_size приводят к разным размерам окон с одинаковыми значениями?

Почему set_size_request(800 600), вызываемый в виджете DrawingArea (также протестирован с Gtk.Button), приводит к окну размером 958 x 791 px, тогда как set_default_size(800 600), вызываемому в Window, приводит к окну соответствующего размера (как измеряется путем взятия скриншот просто окна и смотря на его разрешение)? Я бы понял, если бы было небольшое расхождение по высоте из-за панели заголовка окна, но такая разница в ширине и высоте не имеет смысла для меня. Документация не намекает ни на что подобное. Если бы кто-то мог просветить меня, это было бы здорово!

Вот пример кода, написанный на 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 Чжан, спасибо за тестирование. Я попробовал это снова, разделив его на два приложения, как вы сделали. Размер обоих окон для меня совершенно другой. Я попробовал это на обоих моих мониторах - то же самое.

Кстати, я использую элементарную ОС 0.4.1 Loki, установленная версия libgtk-3-0 3.18.9.

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 против Gtk.Window.set_default_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 означает использование "естественного" размера по умолчанию (запрос размера окна).

  • Gtk.Widget.set_size_request:

    Устанавливает минимальный размер виджета; то есть размер запроса виджета будет как минимум шириной по высоте.

    Вы можете использовать эту функцию, чтобы заставить виджет быть больше, чем обычно.

    В большинстве случаев set_default_size является лучшим выбором для окон верхнего уровня, чем эта функция; установка размера по умолчанию все еще позволит пользователям сжимать окно. Установка запроса размера заставит их покинуть окно, по крайней мере, такого же размера, как запрос размера. При работе с размерами окна set_geometry_hints также может быть полезной функцией.

    Обратите внимание на присущую опасность установки любого фиксированного размера - темы, переводы на другие языки, различные шрифты и действия пользователя могут изменить соответствующий размер для данного виджета. Таким образом, в принципе невозможно жестко закодировать размер, который всегда будет правильным.

    Запрос размера виджета - это наименьший размер, который может принять виджет, все еще функционируя хорошо и рисуя себя правильно. Однако в некоторых странных случаях виджет может быть выделен меньше, чем его запрошенный размер, и во многих случаях виджету может быть выделено больше места, чем запрошено. ... Заданный здесь размер запроса не включает никаких полей из свойств виджета margin-left, margin-right, margin-top и margin-bottom, но он включает в себя почти все остальные свойства padding или border, установленные любым подклассом виджета

Другие вопросы по тегам