Рисование на Canvas (QML)

Добавлено 9 мая 2022 в 15:21

В этом примере мы создадим небольшое приложение для рисования, используя элемент Canvas.

Рисование на Canvas
Рисование на Canvas

Для этого мы разместим четыре цветных квадрата в верхней части нашей сцены с помощью позиционера строки. Цветной квадрат – это простой прямоугольник, заполненный областью обработки событий мыши для обнаружения кликов.

Row {
    id: colorTools
    anchors {
        horizontalCenter: parent.horizontalCenter
        top: parent.top
        topMargin: 8
    }
    property color paintColor: "#33B5E5"
    spacing: 4
    Repeater {
        model: ["#33B5E5", "#99CC00", "#FFBB33", "#FF4444"]
        ColorSquare {
            color: modelData
            active: parent.paintColor == color
            onClicked: {
                parent.paintColor = color
            }
        }
    }
}

Цвета хранятся в массиве и в активном цвете рисования. Когда пользователь кликает на один из квадратов, цвет квадрата присваивается свойству paintColor элемента Row с именем colorTools.

Чтобы включить отслеживание событий мыши на холсте, у нас есть элемент MouseArea, покрывающий элемент холста, и подключены обработчики нажатия и изменения положения.

Canvas {
    id: canvas
    anchors {
        left: parent.left
        right: parent.right
        top: colorTools.bottom
        bottom: parent.bottom
        margins: 8
    }
    property real lastX
    property real lastY
    property color color: colorTools.paintColor

    onPaint: {
        var ctx = getContext('2d')
        ctx.lineWidth = 1.5
        ctx.strokeStyle = canvas.color
        ctx.beginPath()
        ctx.moveTo(lastX, lastY)
        lastX = area.mouseX
        lastY = area.mouseY
        ctx.lineTo(lastX, lastY)
        ctx.stroke()
    }
    MouseArea {
        id: area
        anchors.fill: parent
        onPressed: {
            canvas.lastX = mouseX
            canvas.lastY = mouseY
        }
        onPositionChanged: {
            canvas.requestPaint()
        }
    }
}

Нажатие мыши сохраняет начальную позицию мыши в свойствах lastX и lastY. Каждое изменение положения мыши вызывает запрос на рисование на холсте, что приводит к вызову обработчика onPaint.

Чтобы окончательно нарисовать линию пользователя, в обработчике onPaint мы начинаем новый путь и переходим к последней позиции. Затем мы берем новую позицию из области обработки событий мыши и проводим линию выбранного цвета до новой позиции. Позиция мыши сохраняется как новая последняя позиция.

Теги

CanvasGUI / Графический интерфейс пользователяQMLQtQtQuickПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.