2015-03-05 2 views
1

Je voudrais représenter à l'écran ce qu'une imprimante thermique imprime.Comment afficher la police étirée (double largeur/hauteur)?

L'imprimante a une mise en forme spéciale et peut imprimer une police avec double hauteur ou double largeur, donc j'ai cherché quelque chose mais ni Html ni Rich Text ne semblent avoir une option pour le faire. J'ai également regardé QTextBlock mais je n'ai pas pu trouver quelque chose comme le rapport d'extensibilité ou de largeur.

Le dessin de la police pixel par pixel est-il le seul moyen?

Répondre

2

La question deux questions: amalgame entre

  1. Comment dessiner les polices étirées? C'est simple: changez la mise à l'échelle horizontale ou verticale du QPainter. Qt fera le reste pour vous. E.g:

    QPainter p; 
    p.setTransform(QTransform(2.0, 0, 0, 1.0, 0, 0))); 
    p.drawText(0, 0, "STRETCHED"); 
    
  2. Comment exprimer un étirement dans un texte enrichi? Ce n'est pas directement possible sans modifier les sources Qt - bien que de telles modifications soient assez simples. Sinon, vous pouvez pré-rendre le texte à une image et utiliser l'image au lieu du texte.

+1

Merci. J'ai également trouvé que QFont a la méthode setStretch() qui fait exactement ce dont j'ai besoin. Ensuite, vous devez définir ce QFont à l'QTextBlock souhaité dans le texte enrichi, cela pourrait être la solution. – alez

1

En plus de la suggestion de Kuba Obre, j'ai aussi trouvé que QFont a la méthode setStretch() qui fait exactement ce que je dois.

Ensuite, il y a deux façons d'utiliser cette étirées QFont pour rendre un morceau de document:

  1. créer un document (Rich Text QTextDocument). Je n'ai pas essayé, mais la procédure semble être la suivante (il est plus facile de créer un nouveau RTF plutôt que de charger tout le texte et d'éditer les morceaux de texte désirés).
    QTextCursor::setCharFormat(const QTextCharFormat & format), en utilisant QTextCharFormat::setFontStretch(int factor) directement (pas besoin de passer par QFont). Puis QTextCursor::insertText(const QString & text).

  2. utilisez QPainter avec la police étirée. QPainter::setFont(const QFont & font) puis QPainter::drawText()

La deuxième méthode est plus rapide, mais il faut lutter avec les coordonnées. La première méthode est plus longue mais ressemble à un document texte. Je vais évaluer lequel est le meilleur pour moi.

Espérons que cela soit utile aux autres, a.

1

Ceci est un exemple de travail en utilisant QTextDocument (création de Rich Text Format)

Ayons un widget QTextBrowser dans notre ui, appelé browser

QFont font; //we can optionally .setFamily() 
QTextDocument * rtf = new QTextDocument(this); 
//QTextCursor is needed to write into the TextDocument (otherwise it is readonly) 
QTextCursor * editor = new QTextCursor(rtf); 
QTextCharFormat format = QTextCharFormat(); 
editor->insertText("Normal Text\n"); 
//prepare font for wide text 
font.setStretch(200); 
format.setFont(font); 
editor->setCharFormat(format); 
editor->insertText("WIDE text\n"); 
//prepare font for narrow text 
font.setStretch(50); 
format.setFont(font); 
editor->setCharFormat(format); 
editor->insertText("narrow text\n"); 

ui->browser->setDocument(rtf);