LINUX.ORG.RU

QML и масштабирование

 ,


0

1

Допустим, есть QQuickWidget, в который загружен QML-объект. Размеры этого виджета могут изменяться (он помещён в Layout и лежит уже в нормальном C++ Qt окне). Хотелось бы, чтобы содержимое при этом масштабировалось. Пробовал вот такое:

QSize baseSize(m_quickWidget.rootObject()->width(), m_quickWidget.rootObject()->height());
float scaleX = (float)m_quickWidget.width() / baseSize.width();
float scaleY = (float)m_quickWidget.height() / baseSize.height();
float scale = qMin(scaleX, scaleY);
m_quickWidget.rootObject()->setScale(scale);

Содержимое виджета масштабируется, но весьма криво - центр трансформации как бы не совпадает с центром объекта, как следствие, он не только меняет ширину и высоту, но и съезжает влево-вверх (по факту его часть выходит за границу QQuickWidget и обрезается). При этом позиция виджета (m_quickWidget.rootObject()->position()) остаётся неизменной, так что вернуть его обратно её обнулением не получится.

Как сделать так, чтобы масштабирование работало нормально?

★★★★★

Можно взглянуть на сам qml-объект?

Как насчет не трогать в крестах ничего, а масштабируемость на стороне qml заложить? Там в своем объекте пропишешь transform: Scale { ... } и уже там прибиндишься к размерам окна как тебе нужно.

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

У меня в QML заданы значения размеров многих объектов в пикселях, а не относительно размера родителя. И я слабо себе представляю, как сделать иначе в моём случае. Так что мне кажется, что было бы проще масштабировать вообще весь QML объект.

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

Сделал в QML так:

property double scaleX: 1
property double scaleY: 1
transform: Scale { origin.x: 0; origin.y: 0; xScale: scaleX; yScale: scaleY }

А потом в C++ так:

QSize baseSize(m_quickWidget.rootObject()->width(), m_quickWidget.rootObject()->height());
float scaleX = (float)m_quickWidget.width() / baseSize.width();
float scaleY = (float)m_quickWidget.height() / baseSize.height();
m_quickWidget.rootObject()->setProperty("scaleX", QVariant(scaleX));
m_quickWidget.rootObject()->setProperty("scaleY", QVariant(scaleY));

Вроде работает как, как надо.

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