Ausgefüllten Kreis ins GUI malen + verschieben

Alles rund um die Programmierung mit Qt
Antworten
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Ausgefüllten Kreis ins GUI malen + verschieben

Beitrag von Gapa »

Hallo @all,

ich bastle gerade an einem kleinen Spiel (das berühmte Kanonenspiel, bei dem man Kraft, Winkel und Gravitation einstellen kann und ein Ziel treffen muss) und bleibe nun beim Umsetzen der Mathematik in Grafik hängen!
Ich lasse abhängig von den Benutzereingaben (Kraft, Winkel, Gravitation) mit Hilfe von Vektoren quasi immer die neuen Mittelpunkte einer sich bewegenen Kanonenkugel ausrechnen.
Nun habe ich jedoch keinen blassen Schimmer, wie ich es nun am besten anstelle, quasi um diese Mittelpunkte einen Kreis zeichnen zu lassen und diesen natürlich ständig verschieben zu lassen.
Ich habe noch nie irgendwelche Zeichnungsoperationen in meinen GUIs vorgenommen, deshalb bitte ich hier um ein paar Tipps, vielleicht gibt es ja auch schon vorgefertigte Kreisfunktionen, bei denen man nur Mittelpunkt und Radius angeben muss, das würde mir auch viel Arbeit ersparen. Aber ich hätte auch kein Problem damit, jedes Pixel einzeln zu berechnen und einzufärben. Hauptsache ist, dass mir jemand eine Starthilfe gibt!

Ich wäre euch sehr dankbar!
Gapa
Gestern war heute noch morgen!
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Wenn du die Mittelpunkte schon hast, dann einfach:
http://doc.trolltech.com/4.5/qpainter.html#drawEllipse

mit gleicher höhe und breite versteht sich... und du solltest von x und y jeweils die hälfte der breite/höhe abziehen, damit die kugel auch in der Mitte ist.....

Mfg androphinx
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Ausgefüllten Kreis ins GUI malen + verschieben

Beitrag von franzf »

Gapa hat geschrieben:Hauptsache ist, dass mir jemand eine Starthilfe gibt!
http://doc.trolltech.com/4.4/tutorials-tutorial.html
:D
Insebsondere (für den Ungeduldigen):
http://doc.trolltech.com/4.4/tutorials- ... l-t14.html
Ist auch zum direkt selber kompilieren in den Qt-Sources (scheinbar nimmer bei der 4.5.0, aber immer noch bei den 4.4.3), unter examples/tutorials/tutorial.
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

Hintergrund

Beitrag von Gapa »

Hallo,

erst mal vielen Dank für die nützlichen Antworten!
Ich habe nun mal mittels QPainter::drawEllipse versucht, einen Kreis zeichnen zu lassen, jedoch erschien dieser nicht in meinem GUI.

Kann es sein, dass ich erst mal mittels QPalette einen Hintergrund erstellen muss, auf welchem ich dann zeichnen kann??

Und wofür genau ist die Klasse QPainter??

Also mir wäre schon geholfen, wenn mir jemand die Frage beantwortet, ob man immer zuerst einen "Malerhintergrund" erstellen muss (mittels QPalette) oder ob man im Prinzip auch einfach ins Fenster reinmalen könnte?!

Viele Grüße
Gapa
Gestern war heute noch morgen!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

The QPainter class performs low-level painting on widgets and other paint devices.
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag von Strahlex »

Mit QPainter kannst du nur im paintEvent zeichnen, ich würde das vielleicht eher mit einem GraphicsView machen. Das GraphicsView (bzw. die GraphicsScene) sind Elementbasiert, d.h. du musst dich nicht selbst das Zeichnen kümmern sonder bloß die Elemente erstellen und die Eigenschaften setzten, den Rest übernimmt Qt.
Ein weiterer interessanter Vorteil ist auch, dass man die Scene relativ leicht auch per OpenGL rendern lassen kann, was natürlich einen gewaltigen Geschwindigkeitsvorteil bringt.
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

---

Beitrag von Gapa »

Hallo,

@upsala:
Das bedeutet wohl, dass ich mittels QPainter doch eigentlich direkt ins Fenster zeichnen könnte:

Code: Alles auswählen

QPainter *painter;
painter = new QPainter(this);
painter->drawEllipse(100, 100, 30, 30);
Doch es wird nichts angezeigt...wieso???

@Strahlex:
Hm...danke für die Tipps, werde ich mir sicher mal anschauen. Aber ich hatte mir einfach vorgenommen, alles quasi manuell und ohne Vorlagen zu machen.
Und was bedeutet:
Mit QPainter kannst du nur im paintEvent zeichnen
??

Viele Grüße
Gapa
Gestern war heute noch morgen!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: ---

Beitrag von franzf »

Gapa hat geschrieben: Und was bedeutet:
Mit QPainter kannst du nur im paintEvent zeichnen
??
Im Prinzip kannst du in jeder x-beliebigen Funktion mit nem Painter rumhantieren. Bringt dir aber nix, denn zum Zeichnen wird die Funktion paintEvent() aufgerufen. Diese Funktion überladen, und mit dem obigen Konstrukt (bitte nicht den QPainter auf den Heap... Holst dir am Ende ein Speicherleck) wird dann auch alles brav gezeichnet.

Übrigens:
Ganz ohne Spicken geht es nicht... Schau dir doch wenigstens die Doku/Tutorials zu dem Thema an, und ein paar Examples. Ist für dich angenehmer, als zig Stunden hier im Forum auf Antwort warten zu müssen...
Gapa
Beiträge: 63
Registriert: 4. Juli 2008 14:33
Kontaktdaten:

...

Beitrag von Gapa »

Hallo,

ok hab mich nochmal etwas durch die Doku gewühlt..

2 Fragen habe ich jetzt noch:

1.
Wann genau und wie genau wird denn ein QPaintEvent ausgelöst??

2.
Wieso zeichnet er bei mir nur dann, wenn ich begin() und end() benutze??

Viele Grüße
Gapa
Gestern war heute noch morgen!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: ...

Beitrag von franzf »

Gapa hat geschrieben:2 Fragen habe ich jetzt noch:
1. Wann genau und wie genau wird denn ein QPaintEvent ausgelöst??
2. Wieso zeichnet er bei mir nur dann, wenn ich begin() und end() benutze??
Steht eigentlich auch in der Doku ;)
1) http://doc.trolltech.com/4.5/qwidget.html#paintEvent
2) http://doc.trolltech.com/4.5/qevent.html#details
sonynos
Beiträge: 6
Registriert: 6. März 2009 10:32

Beitrag von sonynos »

ich glaube, Du bist auf dem falschen Weg.

Ich nehme jetzt mal an, Du willst auf einem QWidget zeichnen. Und, um auf Dein Beispiel einzugehen, wenn die Kanone ausglöst wird.

Um auf einem QWidget zu zeichnen, mußt Du die paintEvent-Methode des QWidgets überschreiben (http://doc.trolltech.com/4.5/qwidget.html#paintEvent). Und innerhalb der Implementierung der Methode erzeugst Du Dir einen QPainter, mit dem Du dann Deine Kugel zeichnen kannst.

Aber wie nun das paintEvent auslösen? Einfach im QWidget repaint() auslösen. Oder sauberer: ein entsprechendes Signal definieren und das mittels connect() auf den Slot pappen.

Das wäre eine Möglichkeit. Eine weitere bereits genannte ist: Nutzung von QGraphicsView (http://doc.trolltech.com/4.5/qgraphicsview.html, http://doc.trolltech.com/4.5/graphicsview.html). Meiner Meinung allerdings schwerer einzuarbeiten - bietet allerdings weitaus mehr Möglichkeiten. Ich würde es nur einsetzen, wenn eine Nutzer-Interaktion irgendeiner Art mit der Kugel noch stattfinden soll (per Maus fangen etc.).
Antworten