Russian Qt Forum

Qt => Qt Quick => Тема начата: SektorCT от Июль 23, 2023, 14:20



Название: Позиционирование и размер текста при изменении размера обьекта
Отправлено: SektorCT от Июль 23, 2023, 14:20
Всем привет.
Вопрос опять касаемый обьекта Gauge, а именно теста значений.
https://ibb.co/26qMr3S (https://ibb.co/26qMr3S)

Как видно каждая надпись расположена на одном углу с мажорным тикмарком, но на растоянии. Колличество символов в надписи может быть разным, а значит и размер будет разным. И теперь мы меняем размер самого обьекта, и надписи все должны быть как бы синхронны друг с другом и растояние и размер.
Посоветуйте как лучше расчитать? И самое главное что ведь надо текст посадить по координатам на растоянии(наверное должен быть центром самой надписи) от мажорного тикмарка. Знаю что есть QFontMetrics для работы с текстами и размерами.


Название: Re: Позиционирование и размер текста при изменении размера обьекта
Отправлено: kambala от Июль 23, 2023, 14:59
позицию наверное проще всего считать в зависимости от «четверти» окружности: например, для угла от 0 до 90 — это нижняя правая четверть (в Qt углы растут по часовой стрелке), там надписи надо выстраивать по их нижней правой границе.

как найти оптимальный размер шрифта: ну это уж тебе надо самому пробовать разные варианты, лучше вместе с дизайнером :) самое банальное: взять два размера окна (например, стандартный и 2х) и определить для них нужный размер шрифта (не факт, что во втором случае будет 2х), на основании этой информации добавить в код формулу расчета размера шрифта.


Название: Re: Позиционирование и размер текста при изменении размера обьекта
Отправлено: SektorCT от Июль 25, 2023, 17:27
Смотрите, размер шифта дефолтный известен. Но проблема даже не в нем, а в том как текст расположить в qml так чтобы все надписи(может быть 1 символ а может и 4) гармонично сидели. Главное что известен угол для каждого числа и какое то число в качестве отступа от обьекта(в моем случаи тикмарк) до того места где должен быть текст. например 0 и -100, ширина разная.
Есть например 5 чисел(0, 25,50,75, 100).
Для них число символов и в пикселях такое
Код:
1 7
2 14
2 14
2 14
3 21
таким путем поулчаю
Код:
    QFont font("times", 10);
    QFontMetrics fm(font);
    int pixelsWide = 0;
    int pixelsHigh = fm.height();

Но вот что с данными этими делать пока не могу придумать.
Вот какое положение надписям хочу реализовать.
https://ibb.co/pR9bHJc (https://ibb.co/pR9bHJc)



Название: Re: Позиционирование и размер текста при изменении размера обьекта
Отправлено: SektorCT от Июль 26, 2023, 10:08
позицию наверное проще всего считать в зависимости от «четверти» окружности: например, для угла от 0 до 90 — это нижняя правая четверть (в Qt углы растут по часовой стрелке), там надписи надо выстраивать по их нижней правой границе.

как найти оптимальный размер шрифта: ну это уж тебе надо самому пробовать разные варианты, лучше вместе с дизайнером :) самое банальное: взять два размера окна (например, стандартный и 2х) и определить для них нужный размер шрифта (не факт, что во втором случае будет 2х), на основании этой информации добавить в код формулу расчета размера шрифта.

Я наверное уловил смысл про разделенеи на четверти, но как можно выстаивать по четвертям? Может вы могли бы показать каким то примером?
на данный момент я выстраиваю таким путем, высчитываю размер в пикселях и беру угол, потом нахожу центер и помещаю на угол наклона.
Код:
        Repeater
        {
            id: repeaterValueText

            model: pelData.gaugeDataModel
            anchors.fill: parent

            delegate: Label
            {
                height:        20
                width:         model.eMaxPixelSizeOfTextValue
                color: model.eValueTextColor
                text: model.eScaleValue
                font.pixelSize: model.eValueTextSize
                antialiasing: true
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
                x: model.eValueTextCenterX - model.eCenterTextValueRect.x
                y: model.eValueTextCenterY - model.eCenterTextValueRect.y
            }
        }


Название: Re: Позиционирование и размер текста при изменении размера обьекта
Отправлено: kambala от Август 16, 2023, 16:54
написал бы как решил в итоге :)


Название: Re: Позиционирование и размер текста при изменении размера обьекта
Отправлено: SektorCT от Сентябрь 07, 2023, 18:53
написал бы как решил в итоге :)

Да извеняюсь, уехал в отпуск и не успел поделится.
Сам код qml вот такого вида
Код:
Repeater
        {
            id: repeaterValueText

            model: root.pelData.gaugeDataModel
            anchors.fill: parent

            delegate: Item
            {
                id: delegateItem

                implicitHeight: childrenRect.height
                implicitWidth: delegateItem.eWidth

                required property point eStartPoint
                required property point eEndPoint
                required property real eWidth
                required property color eColorTickMark
                required property string eScaleValue
                required property color eValueTextColor
                required property real eValueTextCenterX
                required property real eValueTextCenterY
                required property real eValueTextSize
                required property int eMaxPixelsWidthText
                required property int eMaxPixelsHeightText
                required property point eCenterTextValueRect

                Text
                {
                    id: labelTextValue

                    height: delegateItem.eMaxPixelsHeightText
                    width: delegateItem.eMaxPixelsWidthText
                    color: delegateItem.eValueTextColor
                    text: delegateItem.eScaleValue
                    font.pixelSize: delegateItem.eValueTextSize
                    antialiasing: true
                    horizontalAlignment: Text.AlignHCenter
                    verticalAlignment: Text.AlignVCenter
                    x: delegateItem.eValueTextCenterX - delegateItem.eCenterTextValueRect.x
                    y: delegateItem.eValueTextCenterY - delegateItem.eCenterTextValueRect.y
                }
            }
        }

В С++ я расчитываю только размер пикселей, получаю угол для каждой цыфры, делаю в процентах отступ в зависимости от размера

Код:
QFontMetrics fm(m_FontText);
    int pixelsWide = 0;
    int pixelsHigh = fm.height();

    pixelsWide = fm.horizontalAdvance(str);

    if (m_MaxPixelsWidthText < pixelsWide)
    {
        m_MaxPixelsWidthText = pixelsWide;
    }

    m_MaxPixelsHeightText = pixelsHigh;

И по сути все.