2010-02-16 12 views
12

Ich habe eine QScrollArea, die mein fantastisches Scroll-Widget hervorbringt. Ich mache gerne bei verschiedenen Gelegenheiten Updates zu den Inhalten.update() oder repaint() kann paintEvent() nicht auslösen

Dafür habe ich einen Override von paintEvent(QPaintEvent *). Dann rufe ich jedes Mal, wenn ich es möchte, das Widget update() an.

Problem:paintEvent() wird nie von diesem aufgerufen!

Was ich bei der Fehlerbehebung versucht, so weit:

  • Verwenden repaint() statt update(). Sollte es sofort anrufen. Leider nicht.
  • Test für isVisible() und updatesEnabled
  • Test, ob meine Überschreibung korrekt ist. Die Größenänderung des Fensters ruft meine Funktion auf. Nur meine manuellen update(), repaint() -Aufrufe scheitern.
  • Implementieren Sie einen QTimer, um update() oder repaint() alle 500ms auszulösen. Der Trigger gibt Textausgabe, die Funktion wird nicht aufgerufen.

Hat jemand eine Idee, was als nächstes zu überprüfen? Was könnte repaint machen() nicht Aufruf paintEvent()?

+0

Nicht auf der QScrollArea, aber stattdessen zugewiesen QLabel löste das Problem für mich. Ich bekomme die update() s für das QLabel. – ypnos

+0

könnten Sie Ihre Header-/Klassendefinition einfügen? Haben Sie alle Ihre Q_OBJECT-Makros dort? gib auch einen kurzen Ausschnitt darüber, wie du dein paintEvent überschreibst() ... – bgs

Antwort

22

Die Lösung ist this->viewport()->repaint() oder this->viewport()->update() von Ihrer QAbstractScrollArea abgeleiteten Klasse zu rufen, anstatt nur repaint() oder update().

Weitere Informationen werden in Qt documentation gegeben:

QWidget * QAbstractScrollArea::viewport() const

Gibt den Ansichtsfenster-Widget. Verwenden Sie die Funktion QScrollArea::widget(), um den Inhalt des Viewport-Widgets abzurufen.

Da die Inhalte, die in unserem QAbstractScrollArea abgeleiteten Klasse haben wird im Ansichtsfenster-Widget angezeigt werden, macht Sinn Ansichtsfenster Widgets Update aufrufen oder unsere Daten neu streichen wieder zeichnen (haben unsere paintEvent genannt).

+0

Grundsätzlich ist das die richtige Antwort. Mein Fehler war, dass ich mein benutzerdefiniertes Widget aus QScrollArea erstellt habe und dachte, dass ich dort meine individuelle Zeichnung machen könnte. Stattdessen müsste ich die Zeichenfunktion des Ansichtsfensters außer Kraft setzen, wahrscheinlich nicht möglich. – ypnos

+0

Es ist möglich, die Zeichenfunktion des Ansichtsfensters zu überschreiben. Sie müssen nur darauf achten, dass das Innere des Viewports reinimplementiert wird. Anstatt "diesen" Zeiger wie beim Erstellen eines QPainter-Objekts zu übergeben, übergeben Sie dieses-> viewport(). QPainter (this-> viewport()) anstelle von QPainter (this). Andernfalls wird der Fehler "QPainter ist nicht aktiv" ausgelöst. – Abhiram

+0

Dies gilt für alle 'Phantasie' Widget, die eine QAbstractScrollArea, wie das QTableWidget verwendet. Vielen Dank für den Hinweis! – eresonance

Verwandte Themen