Russian Qt Forum
Апрель 28, 2024, 00:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Позиционирование и размер текста при изменении размера обьекта  (Прочитано 1881 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« : Июль 23, 2023, 14:20 »

Всем привет.
Вопрос опять касаемый обьекта Gauge, а именно теста значений.
https://ibb.co/26qMr3S

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

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июль 23, 2023, 14:59 »

позицию наверное проще всего считать в зависимости от «четверти» окружности: например, для угла от 0 до 90 — это нижняя правая четверть (в Qt углы растут по часовой стрелке), там надписи надо выстраивать по их нижней правой границе.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #2 : Июль 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

Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #3 : Июль 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
            }
        }
« Последнее редактирование: Июль 26, 2023, 10:11 от SektorCT » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Август 16, 2023, 16:54 »

написал бы как решил в итоге Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #5 : Сентябрь 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;

И по сути все.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.