QT4: PaintEvent zeichen Form bei resize nicht richtig
-
Hallo Zusammen,
in meiner Anwendung wird bei Starten eine Grafik in das QMainWindow mittels
QPainter im PaintEvent gezeichnet.Bei Start erscheint die Grafik korrekt, jedoch wenn ich die Form
in der Größe ändere erscheinen plötzlich nicht mehr alle Details.
- Flächen werden nicht mehr ausgefüllt
- Linien teilweise nicht dargestelltEbenso ist es nicht möglich mittels "EraseRect" den Bildschirm zu löschen.
Wo liegt der Ansatz zur Behebung des Problems ?
Muss ich ein Layout haben für eine Liniengrafik ?
Kann es sein, weil ich kein CentralWidget definiert habe ?
Derzeit habe ich noch kein eigenes widget hierfür erstellt. Wollte ich als nächste durchführen.
Was sagen Meldung "Painting already active", obwohl ich eigentlich nur
im Paintevent Anfang und Ende von Painter definiert habe.
Dauert die Ausführung des paints zu lange ?Wie gross darf der Buffer für Zeichenoperationen sein ?
Gehen Aktion bei Überlauf verloren ?Gruss
-
ohne ein wenig Code immer etwas schwer... auch dein Windowsystem kann einen Einfluss haben (vor allem unter X11)
fürs neuzeichnen kannst du ja im resizeEvent
update()
aufrufen...
-
Hi,
der Code wäre zu viel gewesen. Aber der Hinweis mit dem
resizeEvent update() und einem Fehler in der Applikation hat die Sache geklärt.Zudem bekomme ich im Debugger die Meldung:
QPainter::begin: Painter already active
Welche der Theorie nach durch
if ( ! this->paintingActive() )
nicht möglich sein sollte, da ich nur an dieser Stelle QPainter.Begin/End
sage. Vielleicht macht das noch der Code vom QT-Designer?!Ich verwende übrigens "Kubuntu 8.10 mit Kdevelop 3.5 / KDE 4.4 / QT 4.4.
Gruss
-
man kann Code auch auf relevante Stellen kürzen
Aber ok, so würde ich die paintEvent-Methode ausbauen:
void MyClass::paintEvent( QPaintEvent* /* event */ ) { QPainter painter( this ); painter.drawLine(... . . . }
begin() und end() wird hier automatisch aufgerufen
-
Hier das Beispiel:
void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this); if ( ! this->paintingActive() ) { painter.begin( this ); ActualPaintDevice= &painter; ActualPaintDevice->setBackground(QBrush(QColor(Qt::black))); ActualPaintDevice->setFont( QFont( "DejaVu Sans", 8, QFont::Normal ) ); UpdateScreens(); ActualPaintDevice=NULL; painter.end(); } } void MainWindow::resizeEvent(QResizeEvent *event) { LastScreenArea=-1; update(); QWidget::resizeEvent(event); }
Ich verwende QPainter sonst nur noch als Pointer. Auch werden keine neuen QPainter Objekte angelegt.
Gruss