Странное поведение Canvas в QT / QML - PullRequest
0 голосов
/ 08 января 2019

У меня странная проблема в QML при попытке нарисовать относительно простую графику. Я использую PyQt 5 с QT 5.11 и Ubuntu 18.04. Поскольку графическая часть, которую я пишу, в основном неподвижна (меняется примерно каждые 1 сек), я обнаружил, что canvas - это удобный способ рисовать графику без использования QPainter. Но это был настоящий кошмар со шрифтами.

Например, при рисовании этого простого компонента QML :

import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11

import QtGraphicalEffects 1.0

Rectangle {
    id: cont_rect

    Button {
        text: "Repaint"
        onClicked: {
            cv.clearcv()
            cv.requestPaint()
        }
    }

    property string cvfont: "13px Ubuntu"

    height: 80
    width: 300

    color: "#132931"

    Canvas {
        anchors.fill: parent
        antialiasing: true
        contextType: '2d'

        id: cv
        width:  cont_rect.width
        height: cont_rect.height

        function clearcv() {
            var ctx = cv.context
            ctx.clearRect(0, 0, width, height)
            ctx.fillStyle = "black"
        }


        function drawStateLine() {
            var ctx = (cv.context == null) ? getContext("2d", {alpha: false}) : cv.context
            var x = width/2, y = height - 10
            var txt_angle = -45 * 2*Math.PI / 360

            ctx.save()
            ctx.translate(x,y)
            ctx.rotate(txt_angle)
            ctx.fillStyle = "royalblue"
            ctx.textAlign = "left"
            ctx.font = cvfont
            ctx.textBaseline = "middle"
            ctx.globalAlpha = 1
            ctx.fillText("Detected", 0, 0)
            ctx.restore()
        }

        onPaint: {
            drawStateLine();
        }
    }
}

У меня очень странное графическое поведение.

В первый раз, когда мой компонент рендерится, у меня хороший текст: enter image description here

Затем, когда я щелкаю по своей специально созданной кнопке (для изоляции проблемы до простого компонента), я получаю:

enter image description here

По сути, всякий раз, когда я пытаюсь перекрасить свой проклятый холст, сначала очистив его (я также попробовал ctx.reset (), ctx.fillRect с моим цветом фона и т. Д.), Я получаю гораздо меньше рендеринга шрифтов. читается, и это беспокоит меня.

Есть здесь кто-нибудь, кто знает, как этого избежать? Не знаю, полезно ли это, но я использую 27-дюймовый дисплей с разрешением 1080p.

Спасибо!

...