Просмотр сообщений
|
Страниц: 1 ... 3 4 [5] 6 7 ... 313
|
68
|
Qt / Общие вопросы / Re: cmake и конфигурация сборки и линковки через json
|
: Август 03, 2023, 13:02
|
пресеты задают всякие cmake параметры, типа твоих кастомных переменных, флажков компиляции и т.д., чтоб не писать их вручную в терминале
если ты не добавишь папку проекта через add_subdirectory, то ее в солюшене вообще не будет. как сделать чтоб проект там был, но был unload или чтоб не собирался по умолчанию я не знаю, это надо курить доку cmake касательно студийно-специфических переменных/свойств (а то и вовсе вручную править сгенерированный файл солюшена/проекта)
|
|
|
71
|
Qt / Qt Quick / Re: Нарисовать стрелку внутри rectangle
|
: Июль 25, 2023, 21:42
|
нагуглил или геометрически вывел? так вот сходу неочевидно откуда взялась формула. UPD: а, понял, это ж матрица поворота (и вот мы опять пришли к QTransform ), а offset — это по сути ненулевая у-координата у точек по обе стороны центра стрелки. можно немного улучшить код: C++ (Qt) QPointF calculatePoint(double radius, double angle, double offset) { const auto angleRads = std::numbers::pi * angle / 180.0; const auto sinA = qSin(angleRads); const auto cosA = qCos(angleRads); QPointF pointF{m_MainCircleDiameter.value() / 2, m_MainCircleDiameter.value() / 2}; pointF.rx() += radius * cosA - offset * sinA; pointF.ry() += radius * sinA + offset * cosA; return pointF; }
|
|
|
73
|
Qt / Qt Quick / Re: Нарисовать стрелку внутри rectangle
|
: Июль 23, 2023, 19:47
|
угол на котором они должны быть в направлении нужного значения это половина отрезка между ними угол не может равняться половине отрезка, это разные величины как я понимаю, calculatePoint вычисляет точку на маленькой окружности. по идее тебе достаточно добавить эту точку к каждой точке стрелки, при условии, что стрелка задана в относительных координатах, где (0,0) — это правый край маленькой окружности. также можно задать стрелку для 0 градусов, а потом просто применять к ней QTransform-поворот вместо своих вычислений: C++ (Qt) QPolygonF arrowPointingRight = {{x1, y1}, ...}; auto rotatedArrow = QTransform::fromTranslate(centerX, centerY).rotate(angle).map(arrowPointingRight);
можно такой поворот и к каждой отдельной точке применить при необходимости З.Ы. лучше передавать double по значению
|
|
|
74
|
Qt / Qt Quick / Re: Позиционирование и размер текста при изменении размера обьекта
|
: Июль 23, 2023, 14:59
|
позицию наверное проще всего считать в зависимости от «четверти» окружности: например, для угла от 0 до 90 — это нижняя правая четверть (в Qt углы растут по часовой стрелке), там надписи надо выстраивать по их нижней правой границе. как найти оптимальный размер шрифта: ну это уж тебе надо самому пробовать разные варианты, лучше вместе с дизайнером самое банальное: взять два размера окна (например, стандартный и 2х) и определить для них нужный размер шрифта (не факт, что во втором случае будет 2х), на основании этой информации добавить в код формулу расчета размера шрифта.
|
|
|
75
|
Qt / Qt Quick / Re: Нарисовать стрелку внутри rectangle
|
: Июль 23, 2023, 10:39
|
да, можно стрелку и через PathPolyline нарисовать (можно и через набор PathLine). И такой вопрос, в вашем примере 2 раза PathMove но на них не завязаны сами PathLine. Как они законекчены друг с другом?
они как раз завязаны, рисование выполняется последовательно от «текущей точки». мы начинаем с границы окружности и рисуем рисочку, текущая точка становится концом рисочки. но оба куска стрелки мы хотим начать с границы окружности, поэтому возвращаемся в исходную точку 0,0. вот пример. здесь мы определяем размер стрелки через относительные величины, а потом масштабируем ее до нужного размера через scale (можно и сразу задавать координаты с учетом размера, это не столь существенно). также тут есть небольшая хитрость: стрелка приклеена к маленькой окружности (для случая в 0 градусов), а дальше мы просто выполняем вращение этой окружности, чтоб установить стрелку в нужное положение. в качестве альтернативы можно окружность не вращать, а вращать эфемерный айтем-родитель для стрелки (он будет иметь anchors.fill: smallCircle). но если ты будешь в коде считать координаты заранее, то в этой хитрости нет необходимости. Rectangle { id: smallCircle readonly property real angle: 31 anchors.centerIn: parent width: circle.radius / 3 height: width radius: width / 2 border.color: "black" rotation: angle Shape { id: arrow readonly property real arrowLength: circle.radius - smallCircle.radius readonly property real arrowWidth: 10 readonly property real arrowRelativeLength: 6 readonly property real arrowTipRelativeLength: 2 anchors.verticalCenter: parent.verticalCenter anchors.left: parent.right ShapePath { fillColor: "black" scale: Qt.size(arrow.arrowLength / arrow.arrowRelativeLength, arrow.arrowWidth) PathPolyline { readonly property point topLeft: Qt.point(0, 1) path: [ topLeft, Qt.point(arrow.arrowRelativeLength - arrow.arrowTipRelativeLength, 1), Qt.point(arrow.arrowRelativeLength, 0), Qt.point(arrow.arrowRelativeLength - arrow.arrowTipRelativeLength, -1), Qt.point(0, -1), topLeft, ] } } } }
просто добавить этот элемент после репитера.
|
|
|
|
|