2010-02-16 7 views
12

Ho un QScrollArea che genera il mio fantastico widget di scorrimento. Mi piace fare aggiornamenti sui contenuti in varie occasioni.update() o repaint() non riesce ad attivare paintEvent()

Per questo ho eseguito l'override di paintEvent(QPaintEvent *). Quindi ogni volta che voglio che sia fatto, chiamo il numero update() sul widget.

Problema:paintEvent() non viene mai chiamato da questo!

Quello che ho cercato nella risoluzione dei problemi finora:

  • Uso repaint() invece di update(). Dovrebbe chiamarlo in modo istantaneo. Purtroppo no.
  • Test per isVisible() e updatesEnabled
  • Verificare che il mio override sia corretto. Ridimensionare la finestra delle chiamate la mia funzione. Solo le mie chiamate di aggiornamento manuale(), repaint() hanno esito negativo.
  • Implementare un QTimer per attivare update() o repaint() ogni 500 ms. Il trigger fornisce l'output del testo, la funzione non viene chiamata.

Qualcuno ha un'idea di cosa controllare dopo? Cosa potrebbe rendere il repaint() non call paintEvent()?

+0

Non disegnare su QScrollArea, ma invece la QLabel assegnata ha risolto il problema per me. Ottengo i update() s per QLabel. – ypnos

+0

potresti incollare la tua intestazione/definizione di classe? Avete tutti i vostri macro Q_OBJECT in là? Dare anche un breve snippet su come si sta ignorando paintEvent() ... – bgs

risposta

22

La soluzione è quella di chiamare this->viewport()->repaint() o this->viewport()->update() dalla classe derivata QAbstractScrollArea invece di repaint() o update().

Maggiori informazioni sono contenute nella Qt documentation:

QWidget * QAbstractScrollArea::viewport() const

Restituisce il widget di viewport. Utilizzare la funzione QScrollArea::widget() per recuperare il contenuto del widget viewport.

Dal momento che i contenuti che abbiamo nel nostro QAbstractScrollArea classe derivata verranno visualizzati nel widget finestra, ha un senso per chiamare aggiornamento del widget viewport o ridipingere per disegnare di nuovo i nostri dati (avere il nostro paintEvent chiamato).

+0

Fondamentalmente questa è la risposta corretta. La mia colpa è stata che ho creato il mio widget personalizzato da QScrollArea e ho pensato che potevo fare il mio disegno individuale lì. Invece, dovrei sovrascrivere la funzione di disegno della finestra, probabilmente non è possibile. – ypnos

+0

È possibile sovrascrivere la funzione di disegno di viewport. L'unica cosa di cui devi occuparti all'interno di paintEvent() reimplementato di viewport è- Invece di passare "questo" puntatore come si farebbe normalmente durante la creazione di un oggetto QPainter, passare this-> viewport(). QPainter (this-> viewport()) invece di QPainter (this). In caso contrario viene generato un errore "QPainter non è attivo". – Abhiram

+0

Si applica a qualsiasi widget "di fantasia" che utilizza QAbstractScrollArea, come QTableWidget. Grazie mille per averlo fatto notare! – eresonance

Problemi correlati