QPainterPath

Verschiedenes zu Qt
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

QPainterPath

Beitrag von marvel »

hallo,
kann man grundsätzlich auch linien in einen path zeichnen oder müssen das immer in sich geschlossene objekte sein, also polygone etc ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wie groß wäre eigentlich der Aufwand so etwas selbst zu testen?
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

wahrscheinlich nicht seh groß, nur wollte ich mir das testen ersparen, weil ich sowieso ziemlich unter zeitdruck bin. danke für den rat, werde gleich mal testen.
Himbeer-Toni
Beiträge: 11
Registriert: 7. Juni 2010 07:49

Beitrag von Himbeer-Toni »

upsala hat geschrieben:Wie groß wäre eigentlich der Aufwand so etwas selbst zu testen?
Wie groß wäre eigentlich der Aufwand, die Frage zu beantworten?

Ich meine, es hätten ja mehr als nur marvel was davon, da ich hier z.B. nebenbei mitlese und so meiner Meinung nach einiges lernen kann :)
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

Wie groß wäre eigentlich der Aufwand so etwas selbst zu testen?
ich denke er wollte uns dazu animieren eigene erfahrungen zu machen. grundsätzlich wird einem hier immer gut weitergeholfen.

soooo...
ich konnte erfolgreich linien darstellen. jetzt stehe ich vor der nächsten hürde. ich baue eine luftfahrtkarte nach (ICAO-Karte). darauf sind beispielsweise autobahnen, landstraßen etc abgebildet. jede straßenart hat einen eigenen layer. alle layer aufeinander gepackt ergeben das gesamte straßennetz. jeder layer besitzt objekte die jeweils einen teil einer straßenart darstellt. diese objekte enhalten also jeweils einen painterpath auf denen die koordinaten bereits verzeichnet sind. ich muss also eigentlich nur noch beim erzeugen eines layers alle objekte und dessen painterpaths zusammenführen und würde beispielsweise alle autobahnen angezeigt bekommen.

puhhh...
so viel zu meiner applikation. jetzt möchte ich jedoch komplexere abbildungen erstellen. so eine autobahn lässt sich wunderbar mit linien zeichnen, nur kann so eine autobahn auch einen tunnel oder brücke besitzen. genau hier ist mein problem.

auf dem papier sieht das ganze nämlich so aus:
Bild

ich möchte das ganze an dem tunnelbeispiel fest machen. die gestrichelte linie zwischen den zwei schwarzen balken stellt auch kein problem dar, aber wie kann ich die balken zeichnen so das sie am anfang und am ende des tunnels gezeichnet werden ? muss ich vllt auf rastergrafiken ausweichen oder kann man das auch anders machen ? das problem ist einfach das ich nach festgelegten koordinaten zeichne und keine vorstellung davon habe wie ich das machen kann.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

erst mal solltest du dich entscheiden, ob due direkt malen willst (QPainter)
oder ob du "Malvorschrift" erzeugen willst, und diese dann anzeigen und anderwitig weiterverwenden willst (SVG z.b.).

bei ersteren gibt es zumindest polyline ...
die aber auch wiederum nur hintereinandergehangene Normale linen sind (2 punkte verbindung) ....

Auch polygon gibt es, der den anfang und das ende nochmal verbindet ...

Ciao ....
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

ich glaube du hast mich missverstanden. in der grafik oben wird eine brücke und ein tunnel dargestellt. wenn man sich die schwarzen balken zur darstellung einer brücke oder zur darstellung des ein-/ausgangs eines tunnels mal wegedenkt haben wir eine einfache rote linie die durchgezogen bzw gestrichelt ist. das würde ich auch ohne weiteres hinbekommen, weil ich ja die koordinaten dafür habe. jetzt möchte ich aber die schwarzen balken einzeichnen. wie kann ich das am besten realisieren ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Einfach mit QPolygon(F) oder QPainterPath vorbereiten und anschließend mit QTransform/QMatrix passend drehen.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

wie erstellt man denn layers?
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

Einfach mit QPolygon(F) oder QPainterPath vorbereiten und anschließend mit QTransform/QMatrix passend drehen.
wenn ich einen tunnel habe der durch einen anfang und endpunkt definiert ist, soll ich einfach am anfangs- und am endpunkt ein vorbereiteten path einfügen und ihn so transformieren das er passt. war das damit gemeint ?
wie erstellt man denn layers?
das ist keine qt funktion oder sowas, sondern nur ein begriff der eine ebene beschreibt. auf dieser ebene legt man grafiken ab. mehrere ebenen zusammen ergeben ein bild.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ja. Meiner Meinung nach wäre das das einfachste.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

hm und wie erstell ich mehrere Ebenen, bei mir ist das worauf du malst, doch so eine große Zeichenfläche
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:hm und wie erstell ich mehrere Ebenen, bei mir ist das worauf du malst, doch so eine große Zeichenfläche
Dann muss man sich das selber basteln.

Code: Alles auswählen

class Layer {
public:
    virual void drawLayer( QPainter* p, const LayerInfo& info );
};

class LayeredWidget : public QWidget {
///
void paintEvent( QPaintEvent* e ) {
    // sonst ein Code
    QPainter p(this);
    foreach( Layer* l, m_layers) {
        l->drawLayer(&p);
}
Entweder gibt es jetzt Möglichkeiten, dem Layer Daten zukommen zu lassen (z.B. nen QPainterPath), oder man subclassed für spezielles Verhalten, um z.B. interaktiven Content ala GoogleEarth einzublenden. Musst du halt entscheiden, was du willst.
Das LayerInfo könnte dann eine Möglichkeit sein, spezielle Eigenschaften des Layers (z.B. Transparenz, Position, ...) mitzugeben, muss aber nicht sein, kann man auch direkt über einen Member (samt setter/getter) in Layer erledigen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Man könnte auch GraphicsView verwenden und über die Z-Achse die Ebenen simulieren.
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

hm und wie erstell ich mehrere Ebenen, bei mir ist das worauf du malst, doch so eine große Zeichenfläche
wenn du z.b. ein widget hast kannst du in diesem malen, da es von qpaintdevice abgeleitet ist.
The QPaintDevice class is the base class of objects that can be painted.

A paint device is an abstraction of a two-dimensional space that can be drawn using a QPainter.
ich möchte dir gerne versuchen anhand meines programms das ganze etwas zu erklärne. bei meinen layern (ebenen) speichere ich koordinaten ab. jeder layer repräsentiert einen teil der infrastruktur. ein layer für autobahnen, ein layer für eisenbahnen, ein layer für landstraßen etc.
wenn ich jeden layer zeichne habe ich am ende das gesamte straßensystem.

Code: Alles auswählen

OAC_Map::OAC_Map() : QObject()
{
	// aus einer datei werden koordianten entnommen
	// und in einer liste gespeichert
	parser = new OAC_Parser();
	parser->readFile();
	
	// die liste mit koordinaten wird aus dem parser zurückgegeben
	QList<OAC_Object*> list = parser->getParsedObjects();	
	
	while(!list.isEmpty())
	{
		OAC_Object *object = list.takeLast();

		if(!allLayers.contains(object->getTyp()))
		{
			// ein neuer layer wird erzeugt
			OAC_Layer *layer = new OAC_Layer();
			// dem layer werden die koordinaten zugewiesen
			layer->getObjectList().append(object);
			layer->setDrawingPreferences("red",1,Qt::SolidLine);
			layer->setViewable(true);
			// der layer wird in einem hash mit den anderen layern gespeichert
			allLayers.insert(object->getTyp(),layer);			
		}
		else
		{
			OAC_Layer *layer = allLayers.value(object->getTyp());
			layer->getObjectList().append(object);
		}
	}
	
}
ich hoffe mein beispiel kann dir etwas weiterhelfen.
Antworten