Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Qpainter auf dem Stack erzeugt Absturz der Anwendung

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.10.2002
    Ort
    Witten
    Beiträge
    41

    Qpainter auf dem Stack erzeugt Absturz der Anwendung

    Hallo,

    ich habe ein Widget, in dem in der
    paintEvent()-Funktion ein QPainter auf dem Stack angelgt wird.

    Code:
    QPainter painter(this);
    //// Hier soll gezeichnet werden.
    Wenn ich das Fenster direkt aufrufe:
    Code:
    Dialog *dlg = new Dialog(this);
    dlg->show();
    funktioniert das auch. Doch so bald ich ein Klasse nutze, die von Dialog abgeleitet ist, dann stürzt mein Programm an der Stelle ab.

    paintEvent() der abegleiteten Klasse

    Code:
    void Dialog2::paintEvent(QPaintEvent *event)
    {
        Dialog::paintEvent(event);
        //// Hier werden andere Dinge drüber gezeichnet
    }
    Der Fehler ist :
    QWidget::releaseDC(): failed to release HDC

    Ich weiß, dass das nur unter Windows gilt, aber ich hoffe, das mir trotzdem einer helfen kann, denn bis gestern hat das ganze noch funktioniert, und ich habe nichts an den Klassen geändert.

    Ach noch was. Wenn ich die Dialog :: paintEvent()-Funktion nicht aufrufe aus Dialog2, dann funktioniert das auch so lange ich keinen QPainter auf dem stack erzeuge.

    HeReSY

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Wenn du deinen Code postest, könnte ich das bei mir auf X11 mal ausprobieren.

    Ansonsten kann ich nur sagen, dass das eigentlich funktionieren müsste. Evtl. probierst du ja mal aus, begin und end des QPainters explizit aufzurufen, und den Rückgabewert zu prüfen. Und mit dem Debugger vielleicht mal durch den Destruktor/end steppen.

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.10.2002
    Ort
    Witten
    Beiträge
    41
    Versucht hatte ich das auch schon mal so.

    Code:
    QPainter painter;
    painter.begin(this);
    /// zeichnen
    painter.end();
    hat nur leider auch nichts gebracht. Ist nicht aus der Funktion begin(this) wieder raus gekommen. Deswegen kann ich da auch nicht den Rückgabewert checken.

    Quellcode ist schlecht, da ich den erst noch von unnötigen Balast entfernen müsste. Komplett kann ich den nicht verschicken, weil der von der Arbeit ist.

    HeReSY

    HeReSY

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.10.2002
    Ort
    Witten
    Beiträge
    41
    Ich habe meinen Fehler hoffentlich gefunden.
    Hier der defekte Code

    Code:
    void Dialog::paintEvent(QPaintEvent)
    {
        QPainter painter(this);
        // male irgend etwas
    }
    Nur der Code alleine hat funktioniert.
    Von der abgeleiteten leider nicht.

    Code:
    void Dialog2::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        Dialog::paintEvent(event);
    }
    durch das initialisieren von QPainter vor dem Aufruf der paintEvent Funktion von Dialog, wurde das paintDevice quasi gesperrt und ich hatte kein Zugriff mehr darauf.

    Trotzdem danke für die Hilfe

    HeReSY

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Code:
    void Dialog2::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        Dialog::paintEvent(event);
    }
    Das ist tatsächlich laut Dokumentation nicht möglich. Nur ein QPainter darf gleichzeitig auf einem Paintdevice zeichnen. Da der Destruktor des Painters erst nach Dialog:: paintEvent läuft würde diese Einschränkung verletzt werden, wenn dort, in der aufgerufenen Funktion, noch ein Painter arbeitet.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •