Wie zeichne ich benutzerdefinierte Formen (wie einen Riss) in Qt mit QPainter oder QPainterPath unter Verwendung einer Form oder einer Gruppe von verbundenen Formen

7

Ich habe diese einfache Frage, ich kann nicht eine Form wie eine Träne zeichnen, aber ohne mehr als eine Form (eine Ellipse und ein Polygon), weil der QPen für jede Form gezeichnet wird, möchte ich etwas wie beitreten Formen zum Erstellen eines neuen, oder erzählen Sie QT, dass rund um den Rahmen über beide Formen, für weitere Informationen über das, was ich will, um das Bild zu sehen, ich möchte ein Shabe wie folgt erstellen: Ссылка

sag mir, ob du das Bild sehen und verstehen kannst, was ich will, und danke für deine Hilfe.

    
Diego Fernando Murillo Valenci 10.11.2012, 02:09
quelle

2 Antworten

16

Wenn die Form, die Sie zeichnen möchten, als eine Schichtung anderer Formen dargestellt werden kann, wie das Bild, mit dem Sie verbunden sind, ist es ziemlich einfach:

Zuerst müssen wir ein QPainterPath erstellen, um die äußere Kante der Form darzustellen. Wir bauen es, indem wir einfachere Formen übereinander legen; Im Falle Ihres Beispiels brauchen wir einen Kreis und ein Quadrat. Beachten Sie die Verwendung von QPainterPath::setFillRule(Qt::WindingFill) : Dies wirkt sich später auf die Art und Weise aus, wie der Pfad gemalt wird ( versuchen Sie es zu entfernen, um den Unterschied zu sehen!).

%Vor%

Mit dem Beispiel, das Sie angegeben haben, müssen wir auch einen kreisförmigen Bereich von der Mitte unserer gefüllten Form entfernen. Lassen Sie uns diese innere 'Grenze' als QPainterPath darstellen und dann QPainterPath::subtracted() subtrahieren InnerPath from OuterPath und produzieren unsere endgültige Form:

%Vor%

Sobald wir die Formpfade erstellt haben, müssen wir sie zum Füllen / Umrissen der Form verwenden. Lassen Sie uns zunächst ein QPainter erstellen und es so einstellen, dass es Antialiasing verwendet:

%Vor%

Wir müssen dann die Form füllen, die wir gebaut haben:

%Vor%

Schließlich malen wir die Umrisse. Beachten Sie, dass wir, da wir separate Pfade für die inneren und äußeren Grenzen haben, jeden Rand mit unterschiedlichen Linienstärken streichen können. Beachten Sie auch die Verwendung von QPainterPath::simplified() : Dies konvertiert die Menge der geschichteten Formen in ein QPainterPath , die keine Überschneidungen aufweist:

%Vor%

Wenn wir das alles zusammensetzen, sieht es so aus:

%Vor%     
sjwarner 11.11.2012, 14:51
quelle
2

Das ist eigentlich ziemlich schwierig ohne einen guten mathematischen Hintergrund. Wenn Sie die Formel zum Erstellen dieser Form kennen, können Sie sie einfach in Ihre QGraphicsItem::paint() -Funktion einfügen. Aber es gibt einige Alternativen:

  1. Erstellen Sie das Bild in einem Vektorbearbeitungsprogramm wie Inkscape (kostenlos), speichern Sie es als .svg-Datei und laden Sie es dann in ein QGraphicsSvgItem . (Das würde ich tun.)

  2. Sehen Sie sich QPainterPath :: cubicTo () an um eine Bezier-Kurve zu erstellen

Anthony 10.11.2012 10:17
quelle

Tags und Links