2010-02-16 6 views
12

J'ai une QScrollArea qui crée mon widget de défilement génial. J'aime faire des mises à jour sur le contenu à diverses occasions.update() ou repaint() ne déclenche pas paintEvent()

Pour cela, j'ai fait un remplacement de paintEvent(QPaintEvent *). Ensuite, chaque fois que je veux que ce soit fait, j'appelle update() sur le widget.

Problème:paintEvent() n'est jamais appelé par cela!

Ce que j'ai essayé dans le dépannage à ce jour:

  • Utilisation repaint() au lieu de update(). Devrait l'appeler instantanément. Malheureusement, non.
  • Test pour isVisible() et updatesEnabled
  • Testez si mon remplacement est correct. Redimensionner la fenêtre appelle ma fonction. Seuls mes appels de mise à jour manuelle(), repaint() échouent.
  • Implémentez un QTimer pour déclencher update() ou repaint() toutes les 500ms. Le déclencheur donne la sortie de texte, la fonction n'est pas appelée.

Quelqu'un a-t-il une idée de ce qu'il faut vérifier ensuite? Que pourrait faire repeindre() pas appel paintEvent()?

+0

Ne pas dessiner sur le QScrollArea, mais à la place de son assigné QLabel a résolu le problème pour moi. Je reçois les mises à jour() pour le QLabel. – ypnos

+0

pourriez-vous coller dans votre définition d'en-tête/classe? Avez-vous toutes vos macros Q_OBJECT dedans? donnez également un extrait rapide de la façon dont vous remplacez votre paintEvent() ... – bgs

Répondre

22

La solution est d'appeler this->viewport()->repaint() ou this->viewport()->update() de votre classe dérivée QAbstractScrollArea au lieu de simplement repaint() ou update().

Plus d'info est donnée dans Qt documentation:

QWidget * QAbstractScrollArea::viewport() const

Renvoie le widget de la fenêtre. Utilisez la fonction QScrollArea::widget() pour récupérer le contenu du widget de fenêtre d'affichage.

Comme le contenu que nous avons dans notre QAbstractScrollArea classe dérivée seront affichés dans le widget de la fenêtre, est logique d'appeler la mise à jour du widget fenêtre ou de repeindre pour tirer nos données à nouveau (avoir notre paintEvent appelé).

+0

Fondamentalement, c'est la bonne réponse. Ma faute est que j'ai créé mon widget personnalisé à partir de QScrollArea et j'ai pensé que je pouvais faire mon dessin individuel là-bas. Au lieu de cela, je devrais remplacer la fonction de dessin de la fenêtre, probablement impossible. – ypnos

+0

Il est possible de remplacer la fonction de dessin de la fenêtre. La seule chose dont vous devez vous occuper dans paintEvent() de viewport est: - Au lieu de passer ce pointeur comme on le ferait normalement lors de la création d'un objet QPainter, passez ce-> viewport(). QPainter (this-> viewport()) au lieu de QPainter (this). Sinon, l'erreur "QPainter n'est pas active" est lancée. – Abhiram

+0

Cela s'applique à tout widget «de fantaisie» qui utilise un QAbstractScrollArea, comme le QTableWidget. Merci beaucoup d'avoir signalé ça! – eresonance

Questions connexes