Qt: Mit QPainter Route zeichnen!



  • Hallo,

    ich will die geplanten Pfade und den zurückgelegten Weg auch mit entdeckten Hindernissen (mittels SLAM) visualisieren. Es geht um eine 2D-Zeichnung.

    Dafür bekomme ich die Koordinaten des Roboters und auch der Hindernisse regelmäßig mittels Sensoren. Sobald der Weg zum Ziel geplant wurde, bekomme ich die Koordinaten der zufahrenden Strecke als eine Punkteliste. Ich möchte diesen Weg (z.B. als grüne Linie oder Kurve) auch die entdeckte Hindernisse (z.B. rote Punkte) visualisieren.

    Kann man denn eine 2D-Vektorliste (double, double) mit der Klasse "QPainter" visualisieren? Oder noch besser; kann man das permanent aktuell machen? (z.B.: Solange neue Hindernisse entdeckt werden (also solange neue Koordinaten gespeichert werden), sollen sie auf der Karte eintragen werden.)

    Wenn jemand eine Idee hat oder so was schon gemacht hat; Könnte er denn mir einbisschen erzählen, welche Funktionen oder Klasse ich brauchen werde?



  • Hallo, ich denke das geht.
    Musst eben von dem Widget wo du es drauf zeichnen willst die paintEvent Methode überschreiben. Normal darf man nur da zeichnen. Da kannst dir dann ja die Vector Liste irgendwo als Member der Klasse speichern und wenn sie aktualisiert ist ein repaint() bzw. update() (außerhalb der paintEvent Methode) aufrufen und dann führt er paintEvent wieder aus. In der paintEvent Methode kannst dir ja dann immer die Daten von dem Member holen und malen.



  • Danke für die Antwort! 👍

    die Aufruf-Methode ist mir aber immer noch nicht ganz klar.
    Es gibt 2 verschiedene Sachen:

    1. In einem C++-Projekt (keine GUI) berechne ich die Koordinaten(2D-Vektorlist) der zufahrenden Strecke.
    2. Ich habe eine GUI-Anwendung erstellt und mit QPainter eine Mappe (Szenario) gezeichnet.

    Jetzt möchte ich in 1) berechnete Strecke (Punkteliste) irgendwie zur 2) senden. Während ich 1) kompiliere, muss das Fenster (Widget) von 2) auch geöffnet und die Punkte eintragen werden.

    Wo muss ich denn die PaintEvent-Methode genau aufrufen? Soll denn die Vektorliste als Member-Klasse in 1 oder 2 erstellt werden?

    Nochmals danke für die Antwort..



  • Naja. PaintEvent musst du wohl in der GUI Anwendung überschreiben und da auch update() aufrufen. Und in dieser Anwendung müssen dann ja auch die Daten vorliegen, wenn er sie zeichnen soll. Also erst mal alles in der GUI Anwendung.

    Dein C++ (ohne GUI) kann ja die Daten an einen vereinbarten Ort in eine Datei schreiben. Und die GUI Anwendung liest diese Datei und aktualisiert ihren Member mit den Daten.

    Alternativ dazu könnten die Daten statt in Datei in einer gemeinsam genutzten Datenbank stehen.



  • "Alternativ dazu könnten die Daten statt in Datei in einer gemeinsam genutzten Datenbank stehen."

    Au ja, mit Datenbank meinst du wahrscheinlich z.B. CMAKE-File, nicht wahr? Ich habe sowieso ein CMake-File. Beide (c++ und gui-anwendung) habe ich auf die Liste eingetragen. Ich werde dann in der main()-funktion von C++-Projekt die paintevent()-Funktion von Gui-Anwendung aufrufen.

    Ich wusste nur nicht, ob man in einer normalen C++-Projekt eine Funktion von einer C++-Gui-Anwendung aufrufen kann.

    Danke für deine Antwort. 🙂



  • Erm, Nein. *g*

    Also die PaintEvent Methode kannst du nur überschreiben wo auch eine festgelegt wurde. Also alles was QWidget ist. Zum Beispiel das QMainWindow von deiner GUI Anwendung.

    Nicht in der main!

    Mit Datenbank mein ich was anderes. SQLite zum Beispiel. Das ist eine Datenbank in einer einzigen Datei und darauf könnten ja beide Programme zugreifen. Muss natürlich entsprechend abgesichert sein. Es darf zum Beispiel nur ein Programm schreiben und nicht beide gleichzeitig.

    Du kannst statt Datenbank auch eine XML Datei machen oder eine Ini oder CSV.

    Egal. Irgendwas worauf beide Programme zugreifen können. Weiß ja nicht wie "geheim" die Daten sind. Sind sie das nicht, tut es ja auch XML oder CSV, also Klartext. Da kann deine Konsolenanwendung dann rein schreiben und deine Gui Anwendung kann es raus lesen.


Anmelden zum Antworten