Заливка фигур

Добавлено 13 мая 2022 в 18:51

Заливка фигуры может быть выполнена различными способами. В этом разделе мы рассмотрим общее правило заливки, а также различные способы заливки пути.

Qt Quick Shapes предоставляет два правила заливки, управляемые с помощью свойства fillRule элемента ShapePath. Для него может быть задано значение ShapePath.OddEvenFill, которое используется по умолчанию. Это заполняет каждую часть пути отдельно, а это означает, что вы можете создать фигуру с отверстиями. Альтернативное правило – ShapePath.WindingFill, которое заполняет всё между крайними конечными точками на каждой горизонтальной линии поперек фигуры. Различные результаты показаны на скриншоте ниже. Независимо от правила заливки контур фигуры затем рисуется с помощью пера, поэтому даже при использовании правила ShapePath.WindingFill контур рисуется внутри фигуры.

Примеры заливки фигур
Примеры заливки фигур

В приведенных ниже примерах показано, как использовать эти два правила заливки, чтобы получить фигуры, показанные на скриншоте выше.

Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        fillColor: "orange"
        
        fillRule: ShapePath.OddEvenFill
        
        PathPolyline {
            path: [
                Qt.point(100,  20),
                Qt.point(150, 180),
                Qt.point( 20,  75),
                Qt.point(180,  75),
                Qt.point( 50, 180),
                Qt.point(100,  20),
            ]
        }
    }
}
Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        fillColor: "orange"
        
        fillRule: ShapePath.WindingFill
        
        PathPolyline {
            path: [
                Qt.point(300,  20),
                Qt.point(350, 180),
                Qt.point(220,  75),
                Qt.point(380,  75),
                Qt.point(250, 180),
                Qt.point(300,  20),
            ]
        }
    }
}

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

Примеры градиентов
Примеры градиентов

Чтобы заполнить фигуру сплошным цветом, используется свойство fillColor объекта ShapePath. Установите для него имя или код цвета, и фигура будет заполнена этим цветом.

Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        
        fillColor: "lightgreen"
        
        startX: 20; startY: 140

        PathLine {
            x: 180
            y: 140
        }
        PathArc {
            x: 20
            y: 140
            radiusX: 80
            radiusY: 80
            direction: PathArc.Counterclockwise
            useLargeArc: true
        }
    }
}

Если вы не хотите использовать сплошной цвет, можно использовать градиент. Градиент применяется с использованием свойства fillGradient элемента ShapePath.

Первый градиент, который мы рассмотрим, это LinearGradient. Он создает линейный градиент между начальной и конечной точками. Конечные точки можно располагать как угодно, например, для создания градиента под углом. Между конечными точками можно вставить ряд элементов GradientStop. Они помещаются с помощью свойства position от 0.0, что является позицией x1, y1, до 1.0, что является позицией x2, y2. Для каждой такой остановки указывается цвет. Затем градиент создает мягкие переходы между этими цветами.

СОВЕТ

Если фигура выходит за конечные точки, первый или последний цвет либо продолжается, либо градиент повторяется, либо отражается зеркально. Это поведение задается с помощью свойства spread элемента LinearGradient.

Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        
        fillGradient: LinearGradient {
            x1: 50; y1: 300
            x2: 150; y2: 280
            
            GradientStop { position: 0.0; color: "lightgreen" }
            GradientStop { position: 0.7; color: "yellow" }
            GradientStop { position: 1.0; color: "darkgreen" }
        }

        startX: 20; startY: 340

        PathLine {
            x: 180
            y: 340
        }
        PathArc {
            x: 20
            y: 340
            radiusX: 80
            radiusY: 80
            direction: PathArc.Counterclockwise
            useLargeArc: true
        }
    }
}

Чтобы создать градиент, который распространяется вокруг начала координат, как часы, используется ConicalGradient. Здесь центральная точка задается с помощью свойств centerX и centerY, а начальный угол задается с помощью свойства angle. Остановки градиента затем расставляются от заданного угла по часовой стрелке на 360 градусов.

Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        
        fillGradient: ConicalGradient {
            centerX: 300; centerY: 100
            angle: 45
            
            GradientStop { position: 0.0; color: "lightgreen" }
            GradientStop { position: 0.7; color: "yellow" }
            GradientStop { position: 1.0; color: "darkgreen" }
        }
        
        startX: 220; startY: 140

        PathLine {
            x: 380
            y: 140
        }
        PathArc {
            x: 220
            y: 140
            radiusX: 80
            radiusY: 80
            direction: PathArc.Counterclockwise
            useLargeArc: true
        }
    }
}

Чтобы создать градиент, который формирует круги, немного похожие на кольца на воде, используется RadialGradient. Для него вы указываете две окружности, фокальную (внешнюю) и центральную окружности. Остановки градиента идут от фокального круга к центральному кругу, а за пределами этих кругов последний цвет в зависимости от свойства spread продолжается, отражается или повторяется.

Shape {
    ShapePath {
        strokeWidth: 3
        strokeColor: "darkgray"
        
        fillGradient: RadialGradient {
            centerX: 300; centerY: 250; centerRadius: 120
            focalX: 300; focalY: 220; focalRadius: 10
            
            GradientStop { position: 0.0; color: "lightgreen" }
            GradientStop { position: 0.7; color: "yellow" }
            GradientStop { position: 1.0; color: "darkgreen" }
        }

        startX: 220; startY: 340

        PathLine {
            x: 380
            y: 340
        }
        PathArc {
            x: 220
            y: 340
            radiusX: 80
            radiusY: 80
            direction: PathArc.Counterclockwise
            useLargeArc: true
        }
    }
}

СОВЕТ

Опытный пользователь для заливки фигуры может использовать фрагментный шейдер. Таким образом, у вас есть полная свобода выбора, как заливать фигуру. Для получения дополнительной информации о шейдерах смотрите главу «Эффекты».

Теги

GUI / Графический интерфейс пользователяQMLQtQt Quick ShapesQtQuickПрограммирование

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

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