2010-08-24 9 views
0

Dans l'un de mes projets, j'aimerais disposer d'une zone de texte à défilement automatique.Comment créer une zone de texte à défilement automatique dans Qt?

Je ne parle pas d'une zone de texte qui défile chaque fois que quelqu'un ajoute une ligne de texte, mais de quelque chose qui ressemble à une séquence de film "closing credits".

La zone de texte serait remplie avec du texte et défiler lentement sans intervention de l'utilisateur.

Y a-t-il un widget existant qui correspondrait à cet objectif? Sinon, quel serait le meilleur moyen d'y parvenir?

Répondre

2

L'approche GraphicsView est la plus souple, je pense, si vous voulez quelque chose de fantaisie.

Une approche plus facile pourrait être l'utilisation de "Animation Framework", la mise en place d'un QPropertyAnimation et de le connecter à la propriété "value" de la barre de défilement verticale d'un QTextBrowser. (Regardez les exemples du cadre d'animation).

1

Utilisez QGraphicsView, QGraphicsScene et QGraphicsTextItem. Avec QGraphicsTextItem, vous pouvez utiliser html pour bien mettre en forme votre texte défilant. Puis démarrez une minuterie pour déplacer le QGraphicsTextItem.

+0

Merci. Ne devrais-je pas faire défiler la fenêtre au lieu de déplacer le 'QGraphicsTextItem'? – ereOn

1

La suggestion de Roku d'utiliser QGraphicsView est bonne, mais dans le cas où vous recherchez un rendu de texte complexe, vous ne souhaiterez peut-être pas utiliser QGraphicsView.

Une autre façon de le faire est d'utiliser les capacités de rendu de QTextDocument (à la QAbstractTextDocumentLayout) afin de dessiner la zone de texte d'intérêt. Le défilement consiste simplement à appeler update() pour rendre une nouvelle partie de la région de texte.

Voici quelques Python (PyQt) qui représente la partie de dessin de ce que vous devez faire:

# stored within your widget 
doc = QTextDocument(self) 
doc.setHtml(yourText) # set your text 
doc.setTextWidth(self.width()) # as wide as your current widget 
ctx = QAbstractTextDocumentLayout.PaintContext() 
dl = doc.documentLayout() 

# and within your paint event 
painter.save() 
# you're probably going to draw over the entire widget, but if not 
# painter.translate(areaInWhichToDrawRect); 
painter.setClipRect(areaInWhichToDrawRect.translated(-areaInWhichToDrawRect.topLeft())) 
# by changing the drawing area for each update you emulate scrolling 
ctx.clip = theNextAreaToDraw() 
dl.draw(painter, ctx) 
painter.restore() 
Questions connexes