Ausgefüllten Kreis ins GUI malen + verschieben
Ausgefüllten Kreis ins GUI malen + verschieben
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
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
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
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
Re: Ausgefüllten Kreis ins GUI malen + verschieben
http://doc.trolltech.com/4.4/tutorials-tutorial.htmlGapa hat geschrieben:Hauptsache ist, dass mir jemand eine Starthilfe gibt!
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.
Hintergrund
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
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!
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.
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.
---
Hallo,
@upsala:
Das bedeutet wohl, dass ich mittels QPainter doch eigentlich direkt ins Fenster zeichnen könnte:
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:
Viele Grüße
Gapa
@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);@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!
Re: ---
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.Gapa hat geschrieben: Und was bedeutet:
??Mit QPainter kannst du nur im paintEvent zeichnen
Ü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...
...
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
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!
Re: ...
Steht eigentlich auch in der DokuGapa 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??
1) http://doc.trolltech.com/4.5/qwidget.html#paintEvent
2) http://doc.trolltech.com/4.5/qevent.html#details
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.).
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.).