alex_lip
Aug. 7, 2018, 1:14 p.m.

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()
}
} }
2

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • Aug. 7, 2018, 1:25 p.m.
  • The answer was marked as a solution.

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

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
    • Aug. 7, 2018, 2:18 p.m.
    • (edited)
    Вы два квадрата рисуете - а в примере один и тот же. Там смысл примера в том, что квадрат подготавливается, перемещается, рисуется, канвас поворачивается и опять отрисовывается .

      alex_lip
      • Aug. 7, 2018, 2:33 p.m.
      Видимо пример неверен и нужно два квадрата рисовать (я немного координаты подправил чтобы результат соответствовал картинке).
      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
        • Aug. 7, 2018, 2:38 p.m.

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

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          • Last comments
          • AK
            April 1, 2025, 11:41 a.m.
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            March 9, 2025, 9:02 p.m.
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            March 9, 2025, 4:14 p.m.
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            Nov. 22, 2024, 9:51 p.m.
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          • Evgenii Legotckoi
            Oct. 31, 2024, 11:37 p.m.
            Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup