2012-07-31 2 views
0

J'ai un programme qui doit peindre du texte avec paintEvent(). j'ai essayé ceci:peindre du texte avec paintEvent()

1. QPainter painter; // painter for the canvas 
2. painter.drawText(QPoint location, QString canvasText); 

3. QString canvasText = variablesText.append("<b>"); 
4. variablesText.append((*fieldIter).second.c_str()); 
5. variablesText.append(":</b> "); 
6. variablesText.append(someValue); 
7. variablesText.append("\n"); 

J'ai besoin le texte formatté, canvasText devrait ressembler à:

Certains gras: texte non gras. (newLine)

Texte en gras 2: certains caractères non gras2. (newLine) et ça continue pendant un moment.

Le problème que je vais avoir est qu'un QString ne peut pas avoir du code HTML, donc le texte est affiché comme:

< b>Some bold text:< /b> some not bold text. < b>Some bold text 2: < /b> 
some not bold text2.\n 

Y at-il un moyen d'utiliser attirer paintEvent pour afficher le texte la façon dont j'en ai besoin? avec un QString (ou QLabel ou quelque chose)

J'utilise Qt4.

Merci pour l'aide =)

Répondre

3

QTextDocument semble être un bon moyen pour ce que vous êtes après, plus précisément setHtml(). A QTextDocument peut formater votre texte et peindre le résultat à l'écran via QPainter de votre widget. Quelque chose comme ci-dessous est la solution la plus simple possible:

void Test::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 

    QTextDocument doc; 
    doc.setHtml("<b>Title</b><p>Body Text</p>"); 

    doc.drawContents(&painter, rect()); 
} 

Gardez à l'esprit, cependant, que cela est susceptible d'être très inefficace. Vous aurez probablement besoin de drawContents() pour mettre en cache QPixmap uniquement lorsque votre code source html change ...

+0

Merci @sjwarner, cependant, je dois lui donner un emplacement spécifique là où il le faut être dessiné, j'ai fait ce 'document-> drawContents (& painter, QRect (QPoint.x(), QPoint.y(), rect(). width(), rect(). height())); 'mais il ne montre rien. – user1486311

+0

@sjtaheri semble t'avoir mis sur la bonne voie, alors je vais te laisser le faire ;-) – sjwarner

+0

merci! = D ça marche bien maintenant! – user1486311

2

Supposons que vous essayez d'imprimer le contenu du texte au format HTML dans str sur QRect rect via QPainter peintre. Procédez comme suit:

QString str; // this string contains HTML formatted contents 
QTextDocument * document = new QTextDocument(this) ; 
document->setHtml(str) ; 

painter.translate(rect.left() , rect.top()) ; 
document->drawContents(&painter , QRect(0 , 0, rect.width() , rect.height()) ; 
+0

Merci @sjtaheri! cela fonctionne très bien, mais je dois lui donner un emplacement spécifique que j'ai stocké dans un QList. J'ai fait ce 'document-> drawContents (& painter, QRect (QPoint.x(), QPoint.y(), rect(). Largeur(), rect(). Height()));' mais il ne montre pas n'importe quoi. Si j'utilise des nombres comme 'document-> drawContents (& painter, QRect (20, 20, rect(). Largeur(), rect(). Height()));' montre le rect mais rogné. Des pensées? – user1486311

+0

Pour chaque point, d'abord, traduisez-le en utilisant la méthode painter :: translate avec la position x et y du point comme arguments. Puis dessinez le document en appelant document-> drawContents (& painter, QRect (0, 0, largeur, hauteur) .width et height doivent être assez grands pour que le texte corresponde. Enfin restaurer le peintre en utilisant la méthode QPainter :: restore. cette procédure pour tous les points – sjtaheri

+0

Merci encore @sjtaheri = DI essayé, mais il ne montrera pas le reste des qpixmaps que j'ai sur le peintre, pas même si je fais la restauration: S c'est mon code: 'pour (int i = 0; i getIcon()); QTextDocument * document = nouveau QTextDocument (this); document- > setHtml (iconList [i] -> getVariablesText()); painter.translate (iconList [i] -> getVariablesLocation()); document-> drawContents (& painter, rect()); painter.restore(); qpixmap est invisible, si je commence à cliquer, je prends finalement le qpixmap mais quand je le relâche, il se fane à nouveau. = ( – user1486311

Questions connexes