LINUX.ORG.RU

QWidget aspect ratio

 ,


0

2

Появилась необходимость собрать демку (linux + X11) для библиотеки которую я разрабатываю. Решил собрать GUI на Qt (не писал под Qt4 уже лет 5 наверное) - в демке есть одно окошко которое отрисовывает графику (вывожу ARGB буффер через QImage).

Пользователь может изменять размер окна вывода (ресайз с минимальным и максимальным размером окна).

Проблема: Как можно в Qt (для X11) установить фиксированое соотношение ширины и высоты виджета ? (например 3:4, 6:10, 1:1, 1:2 и тд) Пробовал через кастомный layout, через перекрытие resizeEvent, перекрытие heightForWidth - ничего не работает (по крайней мере у меня).

Есть у кого рабочий пример ? Или пример как вызвать libX11 вызов для QtWidget (чтобы установит X11 size hint в которых есть aspect ratio) ?

★★★★

ты const не пропустил когда переопределял heightForWidth?

з.ы. если дело в этом, напоминаю, в c++11 добавили ключевое слово override => компилятор будет жаловаться если оно указано, а соответствующая сигнатура в базовом классе не найдена

jeuta ★★★★
()

heightForWidth то что тебе нужно, видимо ты ее не переопределил.

m0rph ★★★★★
()

Да я уже раз 5 проверял, даже пример с инета брал - не работет heightForWidth. Плюс часто встерас ссылки что heightForWidth не работает для TopLevel windows in X11. Что какбы логично, потомучто окно это один процесс а виндов менеджер (который собственно и ресайзит окно) - совсем другой и они мягко говоря не сильно то и взаимодействуют между собой (могут вообще работать на разных машинах).

Из док вычитал что в свойствай X11 окна можно выставить aspect ratio (через size hint) Window Manager должен считывать эти свойства и соотвецтвенно сам обеспечивать валидный aspect ratio при ресайзе окна пользователем. Но я еще не разбирался почему эта опция не вытянута наружу у QT (или если и вятянута то где), и как ее вытянуть и работает ли она ...

zaz ★★★★
() автор топика

Вобщем если кому интересно (и для помощи гуглящим - так как я нагуглить рабочего решения не смог). Вот рабочий код

        m_wnd->show();

        XSizeHints sh;
        memset(&sh, 0, sizeof(sh));
        sh.flags        = PMinSize | PMaxSize | PAspect;
        sh.min_width    = 640/5;
        sh.min_height   = 480/5;
        sh.max_width    = 640;
        sh.max_height   = 480;
        sh.min_aspect.x = 640;
        sh.min_aspect.y = 480;
        sh.max_aspect   = sh.min_aspect;
        XSetWMNormalHints(QX11Info::display(), m_wnd->winId(), &sh);
Где m_wnd - Qt Top Level widget

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

heightForWidth вызывается только, если виджет находится в layout'е. Ты бы сразу сказал, что тебе нужен top level widget, а то после

Пробовал через кастомный layout, через перекрытие resizeEvent, перекрытие heightForWidth - ничего не работает (по крайней мере у меня).

это было совсем не очевидно.

m0rph ★★★★★
()

set{Min, Max}Size

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