Seite 1 von 1
Ausgefüllten Kreis ins GUI malen + verschieben
Verfasst: 26. März 2009 14:58
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
Verfasst: 26. März 2009 15:03
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
Re: Ausgefüllten Kreis ins GUI malen + verschieben
Verfasst: 26. März 2009 15:23
von franzf
Gapa hat geschrieben:Hauptsache ist, dass mir jemand eine Starthilfe gibt!
http://doc.trolltech.com/4.4/tutorials-tutorial.html

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
Verfasst: 26. März 2009 16:23
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
Verfasst: 26. März 2009 18:03
von upsala
The QPainter class performs low-level painting on widgets and other paint devices.
Verfasst: 26. März 2009 21:06
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.
---
Verfasst: 26. März 2009 22:44
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
Re: ---
Verfasst: 26. März 2009 22:53
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...
...
Verfasst: 26. März 2009 23:31
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
Re: ...
Verfasst: 27. März 2009 09:35
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
Verfasst: 27. März 2009 11:08
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.).