alex_lip
alex_lip07 серпня 2018 р. 03:14

Rotate canvas QML

Разбираю пример , который должен нарисовать квадрат и такой же квадрат повернутый на 45 градусов.
Почему-то не работает ни translate ни rotate. Пример из книжки(мои только заголовки) - где может быть проблема?

import QtQuick.Window 2.2
import QtQuick 2.10
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

import "content" ApplicationWindow { id:window visible: true width: 840 height: 480 title: qsTr("TEST")
Canvas {
id: root
width: 240; height: 120
onPaint: {
var ctx = getContext("2d")
ctx.strokeStyle = "blue"
ctx.lineWidth = 4

ctx.beginPath()
ctx.rect(-20, -20, 40, 40)
ctx.translate(120,60)
ctx.stroke()

// draw path now rotated
ctx.strokeStyle = "green"
ctx.rotate(Math.PI/4)
ctx.stroke()
}
} }
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

4
Evgenii Legotckoi
  • 07 серпня 2018 р. 03:25
  • Відповідь була позначена як рішення.

Ну вот так это будет работать

import QtQuick.Window 2.2
import QtQuick 2.10
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3


//import "content"
ApplicationWindow {
    id:window
    visible: true
    width: 840
    height: 480
    title: qsTr("TEST")


    Canvas {
        anchors.centerIn: parent
        id: root
        width: 200; height: 200
        onPaint: {
            var ctx = getContext("2d")
            ctx.strokeStyle = "blue"
            ctx.lineWidth = 4

            ctx.beginPath()             // Начинаем рисовать
            ctx.translate(120,60)       // Устанавливаем translation перед началом рисования
            ctx.rect(0, 0, 40, 40)      // Отрисовываем квадрат
            ctx.stroke()                // Заканчиваем рисовать

            // draw path now rotated
            ctx.strokeStyle = "green"
            ctx.beginPath()             // Начинаем рисовать
            ctx.rotate(Math.PI/4)       // Поворачиваем
            ctx.rect(-20, -20, 40, 40)  // Отрисовываем квадрат
            ctx.stroke()                // Заканчиваем рисовать
        }
    }
}

Получается, что изменения translate и rotate нужно устанавливать перед отрисовкой квадратов. Также, если отрисовываем квадраты выходят за область Canvas, это у вас там отрицательные координаты были, то те части квадратов не отрисовываются. Возможно, это можно настроить, но нужно внимательно читать документацию, поскольку
clip: false

не сработало для того, что отрисовывается в обработчике onPaint
    alex_lip
    • 07 серпня 2018 р. 04:18
    • (відредаговано)
    Вы два квадрата рисуете - а в примере один и тот же. Там смысл примера в том, что квадрат подготавливается, перемещается, рисуется, канвас поворачивается и опять отрисовывается .

      alex_lip
      • 07 серпня 2018 р. 04:33
      Видимо пример неверен и нужно два квадрата рисовать (я немного координаты подправил чтобы результат соответствовал картинке).
      ApplicationWindow {
          id:window
          visible: true
          width: 840
          height: 480
          title: qsTr("TEST")
      
      
          Canvas {
                 anchors.centerIn: parent
                 id: root
                 width: 200; height: 200
                 onPaint: {
                     var ctx = getContext("2d")
                     ctx.strokeStyle = "blue"
                     ctx.lineWidth = 4
      
                     ctx.beginPath()             // Начинаем рисовать
                     ctx.translate(120,60)       // Устанавливаем translation перед началом рисования
                     ctx.rect(-20, -20, 40, 40)      // Отрисовываем квадрат
                     ctx.stroke()                // Заканчиваем рисовать
      
                     // draw path now rotated
                     ctx.strokeStyle = "green"
                     ctx.beginPath()             // Начинаем рисовать
                     ctx.rotate(Math.PI/4)       // Поворачиваем
                     ctx.rect(-20, -20, 40, 40)  // Отрисовываем квадрат
                     ctx.stroke()                // Заканчиваем рисовать
                 }
             }
      
      }
      





        Evgenii Legotckoi
        • 07 серпня 2018 р. 04:38

        Мне тоже кажется, что пример ошибочный.. просто совсем никак иначе не работает.

          Коментарі

          Only authorized users can post comments.
          Please, Log in or Sign up
          AD

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:50бали,
          • Рейтинг балів-4
          m
          • molni99
          • 26 жовтня 2024 р. 11:37

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:80бали,
          • Рейтинг балів4
          m
          • molni99
          • 26 жовтня 2024 р. 11:29

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:20бали,
          • Рейтинг балів-10
          Останні коментарі
          ИМ
          Игорь Максимов22 листопада 2024 р. 22:51
          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii Legotckoi01 листопада 2024 р. 00:37
          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZE19 жовтня 2024 р. 18:19
          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь Максимов05 жовтня 2024 р. 17:51
          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas505 липня 2024 р. 21:02
          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Тепер обговоріть на форумі
          Evgenii Legotckoi
          Evgenii Legotckoi25 червня 2024 р. 01:11
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          t
          tonypeachey115 листопада 2024 р. 17:04
          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
          NSProject
          NSProject04 червня 2022 р. 13:49
          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
          9
          9Anonim25 жовтня 2024 р. 19:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Слідкуйте за нами в соціальних мережах