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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Нарисовать стрелку внутри rectangle  (Прочитано 5009 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« : Июля 21, 2023, 14:30 »

Всем привет.
Может кто подсказать, имеется обьект Rectangle с заданной шириной и длиной. И вот внутри него мне точно внутри него по границе надо нарисовать стрелку через Shape.
Как понимаю можно через PathMultiline сделать. То есть нужно по ширине его занять, а по длине будет будет острый конец.
Почему хочу нарисовать в rectangle, мне надо эту стрелку двигать, и если будет в rectangle то мне надо двигать его и точки у Shape не придется пересчитывать.
Ну а вторйо вариант это прям в Shape нарисовать стрелку и пересчитывать все точки.
Если у кого есть какой то пример буду признателен.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

лично я вообще не понял как должна выглядеть эта стрелка и как/куда она будет двигаться. может картинка есть?
Записан

Изучением 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

Сообщений: 229


Просмотр профиля
« Ответ #2 : Июля 22, 2023, 09:19 »

лично я вообще не понял как должна выглядеть эта стрелка и как/куда она будет двигаться. может картинка есть?

Вот на данном обьекте стрелка https://ibb.co/Dw6WqzC и она двигается по кругу в зависимости от текущего значения.
Первая мысль это сделать прямоугольник с нужным значением в зависимости от размера всего обьекта, и поместить в него Shape.
Но первое что не понятно так это как в С++ понять углы прямоугольника, где право а где лево.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июля 22, 2023, 10:59 »

надо было сказать «как в спидометре» Улыбающийся

твой Rectangle — это внешняя черная окружность? не вижу чем рисование стрелки отличается от рисования любой из рисочек. ты знаешь угол наклона стрелки, а ее длина — это радиус большой окружности минус радиус маленькой.

для анимации надо всего лишь угол стрелки изменить, что поменяет координаты ее Shape'а.
Записан

Изучением 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

Сообщений: 229


Просмотр профиля
« Ответ #4 : Июля 22, 2023, 14:05 »

надо было сказать «как в спидометре» Улыбающийся

твой Rectangle — это внешняя черная окружность? не вижу чем рисование стрелки отличается от рисования любой из рисочек. ты знаешь угол наклона стрелки, а ее длина — это радиус большой окружности минус радиус маленькой.

для анимации надо всего лишь угол стрелки изменить, что поменяет координаты ее Shape'а.

Нет, rectangle при первом варианте внешнеи границы для стрелки. Будет прозрачным, при изменении значения меняется угол и перемещается невидимый rectangle. Пересчитывать точки в этмо случаи не надо. Но в этом случаи надо из qml передавать в С++ данные о rectangle.(я не знаю что нужно передавать чтоыб понимать как нарисовать внутри стрелку.)
Другой вариант это зная какой размер у стрелки рисовать, и при измении пересчитывать все точки.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июля 22, 2023, 14:30 »

давай так. какие у тебя входные данные? т.е. по каким данным ты собираешься строить стрелку?

глядя на картинку, предполагаю, что у тебя всё нарисовано кроме стрелки (соответственно, в qml доступны все видимые объекты). из С++ будет приходить значение «скорости» от 0 до 1.2?

«невидимый прямоугольник» — это ж просто координаты обрамляющего стрелку прямоугольника, насколько я понимаю?
« Последнее редактирование: Июля 22, 2023, 14:31 от kambala » Записан

Изучением 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

Сообщений: 229


Просмотр профиля
« Ответ #6 : Июля 22, 2023, 14:40 »

давай так. какие у тебя входные данные? т.е. по каким данным ты собираешься строить стрелку?

глядя на картинку, предполагаю, что у тебя всё нарисовано кроме стрелки (соответственно, в qml доступны все видимые объекты). из С++ будет приходить значение «скорости» от 0 до 1.2?

«невидимый прямоугольник» — это ж просто координаты обрамляющего стрелку прямоугольника, насколько я понимаю?

1. Все размеры каждого обьекта это все из С++, и для ширины и длинны стрелки так же есть данные. Есть значение на которое стрелка должна будет поворачиватся, то есть для угла так же значения имеются.
2. Невидимы прямоугольник - как первый вариант что я описал выше да, это по сути было бы обрамлением. Но как я писал выше надо будет из qml послать нужные значения о нем в С++, получить все точки и массивом послать обратно. Но вот как определить левую и правую сторону его чтоыб стрелка правильно смотрела, это я вообще не моуг представить.

Но при другмо варианте без прямоугольника нужно бы было высчитывать все точки не в прямоугольнике а в общем области тахометра.

Это пока начальынй набросок кода.
Код:
Rectangle
{
    id: root

    property QtObject pelData
    property real needleData

    height: pelData.needle.needleLength
    width: pelData.needle.needleWidth

    color:"blue"

    Component.onCompleted:
        console.log(pelData.valueNeedleData, pelData.needle.needleLength)

    Shape
    {
        height:        root.size
        width:         root.size
        layer.enabled: true
        layer.samples: 8

        ShapePath
        {
            id: trackShapePath
            capStyle:    Qt.FlatCap
            fillColor:   "transparent"
            strokeColor: "red"
            strokeWidth: pelData.mainCircleBorderWidth

            PathPolyline {
                id: ppl
                path: [ Qt.point(0.0, 0.0),
                        Qt.point(3.0, 5.0),
                        Qt.point(5.0, 8.0),
                        Qt.point(8.0, 0.0)
                      ]
            }
        }
    }
}
Записан