2011-04-20 3 views
4

Existe-t-il un moyen de prendre un QPainterPath et de le développer, comme la commande Sélection> Agrandir ... (ou Agrandir ...) dans Photoshop?QPainterPath développer/développer

Je veux prendre le QPainterPath retourné de QGraphicsItem::shape et l'utiliser comme base pour un QGraphicsPathItem. Mais je veux étendre la forme d'un montant donné, disons 10 pixels tout autour. Et puis tracez un contour mince autour de cette forme élargie.

Je genre de faire en réglant la largeur de la QPen utilisée pour dessiner le QGraphicsPathItem-20 (ma largeur désirée * 2 car il attire la moitié à l'intérieur et à l'extérieur de la moitié). Cela donne la bonne forme extérieure, mais avec une ligne épaisse et laide; il n'y a aucun moyen (que je peux voir) pour obtenir cette forme et esquisser avec une ligne fine.

La classe QPainterPathStroker semble prometteuse, mais je n'arrive pas à la faire faire ce que je veux.

Répondre

4

QPainterPathStroker est la bonne idée:

QPainterPathStroker stroker; 
stroker.setWidth(20); 
stroker.setJoinStyle(Qt::MiterJoin); // and other adjustments you need 
QPainterPath newpath = (stroker.createStroke(oldPath) + oldPath).simplified(); 

QPainterPath::operator+() 2 voies et unit simplified() se fond sous-chemins. Cela gérera également les chemins "évidés".

5

Pour pousser un QPainterPath par x pixels, vous pouvez utiliser un QPainterPathStroker avec un large stylo, puis unir l'original avec le chemin caressait:

cependant
QPainterPath grow(const QPainterPath & pp, int amount) { 
    QPainterPathStroker stroker; 
    stroker.setWidth(2 * amount); 
    const QPainterPath stroked = stroker.createStroke(pp); 
    return stroked.united(pp); 
} 

Notez que depuis Qt 4.7, le united() function (et opérations similaires) transformez les chemins en polylignes pour contourner une instabilité numérique dans le code d'intersection de chemins. Bien que ce soit bien pour le dessin (il ne devrait pas y avoir de différence visible entre les deux méthodes), si vous avez l'intention de garder le QPainterPath, par exemple. pour permettre d'autres opérations dessus (vous avez mentionné Photoshop), alors cela détruira toutes les courbes bezier, ce qui n'est probablement pas ce que vous vouliez.

Questions connexes