update () o ridipingere () non riesce a innescare paintEvent ()
Domanda
Ho un QScrollArea paternità mio widget di impressionante scorrimento. Mi piace fare gli aggiornamenti sui contenuti in varie occasioni.
Per questo ho fatto un override di paintEvent(QPaintEvent *)
. Poi ogni volta che voglio che sia fatto io chiamo update()
sul widget.
Problema: paintEvent()
non viene mai chiamato da questo
Quello che ho cercato nella risoluzione dei problemi finora:
- Usa
repaint()
invece diupdate()
. Dovrebbe chiamare instantanously. Purtroppo non. - Prova per
isVisible()
eupdatesEnabled
- Prova wether mia esclusione è corretta. Ridimensionamento della finestra chiama la mia funzione. Solo il mio aggiornamento manuale (), ridipingere () chiamate sicuro.
- Implementare una QTimer per innescare update () o ridipingere () ogni 500ms. Il trigger dà output di testo, la funzione non viene chiamata.
Qualcuno ha un'idea di cosa controllare dopo? Che cosa potrebbe fare repaint () non chiamare paintEvent ()?
Soluzione
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 documentazione :
QWidget * QAbstractScrollArea::viewport () const
Restituisce il widget di viewport. Utilizzare la funzione
QScrollArea::widget()
per recuperare il contenuto del widget finestra.
Dato che i contenuti che abbiamo nel nostro classe derivata QAbstractScrollArea
verrà visualizzato nel widget viewport, ha senso chiamare aggiornamento del widget viewport o ridipingere per disegnare di nuovo i nostri dati (abbiamo la nostra paintEvent
chiamato).