QPainer und paintEvent



  • Hallo!

    Ich bin Qt-Noob im Bereich Drawing und werde aus dem paintEvent einfach nicht schlau. Ich habe mir schon etliche Qt-Demos zu dem Thema angesehen, aber die Beispiele sind nicht so, wie ich das erwartet habe.

    Ich möchte gerne Methoden haben, um diverse Dinge zu zeichnen, z.B. eine Ellipse oder eine Linie.

    Offensichtlich kann man auf dem Widget nur innerhalb der paintEvent-Methode zeichnen.

    void MyWidget::paintEvent(QPaintEvent * /* event */)
    {
        QPainter painter(this);
    

    In den offiziellen Demos habe ich da schon etliche Switch-Ketten gesehen.

    Ist es möglich außerhalb auf einem Pixmap oder einem QImage zu zeichnen und dann in paintEvent die Methode painter.drawPixmap() oder painter.drawImage() aufzurufen nachdem man in seiner zeichneKreis() Methode update() aufgerufen hat? 😕

    Dabei soll aber das bereits auf dem Widget gezeichnete Zeug erhalten bleiben.

    Bei mir wird ein bereits gezeichneter Kreis gelöscht, nachdem ich eine Linie gezeichnet habe.



  • Nachtrag: Mir ist schon in den Sinn gekommen etwas in dieser Art zu schreiben.

    void MyWidget:zeichneKreis(int x, int y, int r)
    {
        // x,y,r als Objekt in QList speichern
    }
    
    void MyWidget::paintEvent(QPaintEvent * /* event */)
    {
        QPainter painter(this);
    
        for(durchlaufe QList und zeichne alle Kreise mit painter)
        for(durchlaufe QList2 und zeichne alle Linien mit painter)
        etc.
    

    Aber das kann doch wohl kaum die ideale Lösung sein? 🙄



  • Matz_E schrieb:

    Aber das kann doch wohl kaum die ideale Lösung sein? 🙄

    Es ist vor allem deshalb nicht die ideale Lösung, weil du die Reihenfolge der hinzugefügten Objekte verlierst.
    Und ja, das paintEvent malt immer von 0 weg, alter Content wird gelöscht, um eine Speicherung vergangener States musst du dich selber kümmern - oder direkt mit dem Qt GraphicsView Framework arbeiten.



  • arghonaut schrieb:

    Matz_E schrieb:

    Aber das kann doch wohl kaum die ideale Lösung sein? 🙄

    Es ist vor allem deshalb nicht die ideale Lösung, weil du die Reihenfolge der hinzugefügten Objekte verlierst.
    Und ja, das paintEvent malt immer von 0 weg, alter Content wird gelöscht, um eine Speicherung vergangener States musst du dich selber kümmern - oder direkt mit dem Qt GraphicsView Framework arbeiten.

    Hallo arghonaut!

    Das mit der Reihenfolge ist kein Problem. Dann schreibe ich eben eine virtuelle Basisklasse und leite davon alle meine Objekte (Kreis, Linie, etc.) ab. Dort implementiere ich eine Funktion draw(QPainter*) und speichere die Zeige auf die Objekte in einer QList oder vector.

    Dann kann ich durch die Liste iterieren, und die Objekte zeichnen sich in der originalen Reihenfolge selbst.

    Der interessante Punkt war das paintEvent immer bei 0 malt. Danke für die Info! 🙂


Anmelden zum Antworten