LINUX.ORG.RU

Осваиваю GTK3, подскажите пожалуйста

 


0

1

Изучаю GTK3, читаю официальную документацию: https://developer.gnome.org/gtk3/stable/GtkWindow.html

Подскажите пожалуйста с окном, не могу найти как от него 2 вещи добиться:

1. нужно установить минимальный размер, то есть высоту/ширину меньше которых оно не уменьшается при ресайзе;

2. нужен сигнал о ресайзе окна.

Сигнал 'size-allocate', в нём скорее всего и можно ограничивать размер.

Novator ★★★★★
()

Проверил, вот эта фигня работает:

self.signal_connect('size-allocate') do |widget, alloc|
  if alloc.width<400
    widget.set_size_request(400, alloc.height)
  elsif alloc.height<300
    widget.set_size_request(alloc.width, 300)
  end
  true
end
Novator ★★★★★
()
Ответ на: комментарий от Novator

Проверил, вот эта фигня работает:

Не нужно к сигналу цепляться, чтобы ограничить минимальный размер. Достаточно просто выставить: widget.set_size_request(400, 300);

2. нужен сигнал о ресайзе окна.

https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-configure-event

nvl ★★★
()
Ответ на: комментарий от nvl

Достаточно просто выставить: widget.set_size_request(400, 300);

А, точно, работает - и это гораздо проще.
Я даже этим пользовался, но сейчас не вспомнил :)

Ещё вариант: пишут, что начиная с Gtk3 появился CCS, и там можно задавать лимиты, но имхо это не труЪ.

Novator ★★★★★
()
Ответ на: комментарий от Novator

Ещё вариант: пишут, что начиная с Gtk3 появился CCS, и там можно задавать лимиты, но имхо это не труЪ.

CSS для стайлинга, а не для лэйаута. Ты можешь задавать размеры декора (толщина рамки, радиус скругления углов и т.п.), но не самого виджета.

nvl ★★★
()
Ответ на: комментарий от nvl

widget.set_size_request(400, 300);

Спасибо, оно.

Вот же я балбес, смотрю виджеты, а родительский класс заглянуть даже мысли не возникло.

Этот тип: «gpointer» - что он из себя представляет?

Простите за дилетантские вопросы, если можно покажите заголовок привязываемого метода и строку его привязки.

Dimitriy
() автор топика
Ответ на: комментарий от Dimitriy

Пардон, всё подключил, слегка накосячил при первой попытке )))

А в свете этого возникло ещё 2 вопроса:

1. в передаваемых параметрах в метод уже есть размер окна (виджета)? Или как наиболее оптимально его получить?

2. Как получить список всех потомков окна (размещённых на нём ГТК виджетов)? Причём если это древовидная иерархия то не только первого уровня.

Dimitriy
() автор топика
Ответ на: комментарий от Dimitriy

1. в передаваемых параметрах в метод уже есть размер окна (виджета)? Или как наиболее оптимально его получить?

Передаешь само окно как gpointer user_data и получаешь размеры: gtk-widget-get-allocated-width и gtk-widget-get-allocated-height

2. Как получить список всех потомков окна (размещённых на нём ГТК виджетов)? Причём если это древовидная иерархия то не только первого уровня.

Тебе лучше использовать структуру для этих целей (и её передавать как user_data)

typedef struct {
  GtkWindow *window;
  GtkWidget *button;
  GtkLabel *label1;
  GtkLabel *label2;
} MyCustomWindow;

nvl ★★★
()
Последнее исправление: nvl (всего исправлений: 1)
Ответ на: комментарий от Dimitriy

1. в передаваемых параметрах в метод уже есть размер окна (виджета)? Или как наиболее оптимально его получить?

Размеры виджета (окна) передаются у обоих сигналов, только по-разному.

1) size-allocate:
В виде [widget, alloc]
где alloc - Gtk::Allocation:

Gtk::Allocation.new(x, y, width, height)
Creates a new Gtk::Allocation.
x: The X position of the widget's area relative to its parents allocation. (Integer)
y: The Y position of the widget's area relative to its parents allocation. (Integer)
width: The width of the widget's allocated area. (Integer)
height: The height of the widget's allocated area.(Integer)
Returns: a new Gtk::Allocation

Например: alloc.width и alloc.height.

2) configure-event: self, event В виде [widget, allocation]
где event - Gdk::EventConfigure.
Свойства у структуры Gdk::EventConfigure аналогичны Gtk::Allocation.

Например: event.width и event.height.

В своём время я пробовал оба сигнала, но остановился на первом - почему, не помню, но скорей всего были причины.

Какой у вас язык, вы не указали, и как в нем сигналы цепляются к методам - я не знаю. Выше пример приведен для языка Ruby.

Novator ★★★★★
()
Ответ на: комментарий от Dimitriy

размер окна (виджета)? Или как наиболее оптимально его получить?

Если размер виджета нужно получать фактический или за пределами указанных сигналов, то используй свойство:

widget.allocation

Например так:

widget.allocation.width
widget.allocation.height

Не путай widget.allocation с widget.size_request.
Первое свойство показывает фактический размер и положение виджета, а второе - желаемый (требуемый) [минимальный] размер.

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от nvl

CSS для стайлинга, а не для лэйаута. Ты можешь задавать размеры декора (толщина рамки, радиус скругления углов и т.п.), но не самого виджета.

В Gtk3 я даже погружаться не хочу.
С Gtk2 собираюсь уходить на FOX toolkit - с меня этого перераздутого замороченного ГЫТЫКА-дерьма хватит! :)

Novator ★★★★★
()
Ответ на: комментарий от Dimitriy

2. Как получить список всех потомков окна (размещённых на нём ГТК виджетов)? Причём если это древовидная иерархия то не только первого уровня.

Всё что содержит дочерние виджеты является либо потомком Gtk::Container, либо Gtk::Bin.

Первый имеет свойство container.children, второй - window.child.

Ну а родитель-носитель виджета всегда прописывается в widget.parent.

Соответственно, чтобы получить список потомков, нужно рекурсивно двигаться вниз по child и children, или если вверх - то по parent.

Novator ★★★★★
()

Хорошо, спасибо большое копаю дальше.

Ещё один вопрос, а можно у GtkWidget запросить название их класса, не в смысле «GtkWidget», а всё их разнообразие?

Dimitriy
() автор топика
Ответ на: комментарий от Dimitriy

можно у GtkWidget запросить название их класса, не в смысле «GtkWidget», а всё их разнообразие?

Язык программирования задекларируй, может какой псевдо код для примера напиши. Так нифига не понятно, что за разнообразие классов ты хочешь и для чего?

nvl ★★★
()
Ответ на: комментарий от nvl

Да нет, я не о языке разработки, со стороны средств самого ГТК существует метод который вернёт название класса ГТКвиджета?

Dimitriy
() автор топика
Ответ на: комментарий от bonta

А о кьюти что думаете?

Ничего. Мне он без надобности. Да и порог вхождения высоковат для меня, там как минимум, нужен монструозный C++.

nvl ★★★
()
Ответ на: комментарий от bonta

А о кьюти что думаете? )

до тех пор пока не подружится со стандартным c++ - шлак

eternal_sorrow ★★★★★
()
Ответ на: комментарий от nvl

нифига не понятно, что за разнообразие классов ты хочешь

Скорей всего он хочет всю иерархию сразу видеть, типа:

Widget > Container > Bin > Window

Но сам программировать ничего не хочет. И свой язык нам стесняется сказать.

Novator ★★★★★
()
Ответ на: комментарий от nvl

g_print («%s\n», G_OBJECT_TYPE_NAME (win) ); // напечатает «GtkWindow»

Да, почти то что искал, возвращает как раз то что интересовало (я правда это в переменную выловить хотел)..., но признаюсь немного покрутил тему, не особо оно удобно мне, я тут наверное свою структуру навелосипедирую.

Но сам программировать ничего не хочет. И свой язык нам стесняется сказать.

Я пока ещё ничего не программирую, изучаю вопрос. Упражняюсь с FreeBasic'ом, но интересуют вопросы только по GTK/

Dimitriy
() автор топика

Можно ли окну ГТК заменить событие по умолчанию на нажатие кнопки с крестиком, что бы оно не закрывалось, а просто изменяло состояние видимости.

Dimitriy
() автор топика
Ответ на: комментарий от anonymous

В настройках убрать декорации окна для развернутых на весь экран приложений или только для фокса

anonymous
()
Ответ на: комментарий от Dimitriy

Вопрос:

Можно ли окну ГТК заменить событие по умолчанию на нажатие кнопки с крестиком, что бы оно не закрывалось, а просто изменяло состояние видимости.

Актуален

Dimitriy
() автор топика
Ответ на: комментарий от anonymous

спасибо, снес firefox поставил waterfox и добавил расширение HTitle все -гуд , прошу прощения за офтоп я только учусь ...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.