14 votes

Comment activer l'anticrénelage sur les formes QML ?

Voici un fichier QML qui contient un contrôle Dial et une forme personnalisée côte à côte :

import QtQuick 2.9
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.3
import QtQuick.Window 2.2
import QtQuick.Shapes 1.0

Window {
    id: window
    visible: true
    width: 400
    height: 200

    RowLayout {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        spacing: 5

        Dial {
            id: dial1
        }

        Control {
            id: dial2

            implicitWidth: dial1.width
            implicitHeight: dial1.height

            antialiasing: true

            Shape {
                anchors.fill: parent

                antialiasing: true

                ShapePath {
                    strokeWidth: 1
                    strokeColor: dial2.visualFocus ? dial2.palette.highlight : dial2.palette.dark

                    startX: dial2.width/2
                    startY: 0

                    PathArc {
                        x: dial2.width/2
                        y: dial2.height
                        radiusX: dial2.width/2
                        radiusY: dial2.height/2
                        direction: PathArc.Clockwise
                    }

                    PathArc {
                        x: dial2.width/2
                        y: 0
                        radiusX: dial2.width/2
                        radiusY: dial2.height/2
                        direction: PathArc.Clockwise
                    }

                }
            }
        }
    }
}

Depuis antialiasing: true est défini à la fois sur le contrôle et sur la forme, je me serais attendu à ce que le chemin soit lisse. Or, il est en dents de scie :

Dial and custom shape

Comment puis-je antialiaser la forme ?

28voto

dragly Points 918

Según l'article du blog sur les formes rapides de QtQuick vous devez soit activer le multi-échantillonnage sur l'ensemble de la scène, soit sur une couche QtQuick.

Vous semblez utiliser un QQmlApplicationEngine, auquel cas vous pouvez simplement définir le format de surface par défaut dans main.cpp :

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QSurfaceFormat format;
    format.setSamples(8);
    QSurfaceFormat::setDefaultFormat(format);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

Alternativement, si vous préférez restreindre ce paramètre à une seule couche QtQuick, vous pouvez également définir le nombre d'échantillons comme ceci :

import QtQuick 2.8
import QtQuick.Window 2.2
import QtQuick.Shapes 1.0

Window {
    visible: true
    width: 640
    height: 480

    Item {
        id: root
        anchors.fill: parent
        layer.enabled: true
        layer.samples: 4
        // your shapes here ...
    }
}

Le réglage sur une couche semble être cassé pour moi avec vendorExtensionsEnabled: true sur la forme, qui est la valeur par défaut. En le réglant sur false semble fonctionner.

0voto

teh_raab Points 232

Avez-vous essayé d'activer la fonction "smooth" ? Je vérifierais bien mais j'utilise actuellement Qt 4.8 pour un projet et je n'ai pas la version 5.x chargée pour l'essayer moi-même.

https://doc.qt.io/qt-5.10/qml-qtquick-item.html#smooth-prop

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X