2016-08-12 1 views
1

Avec Qt 5.4.2, j'utilise un QPainterPath pour afficher du texte, car le texte peut être divisé en caractères et chaque caractère rendu le long d'une courbe. Je vois des résultats différents à travers les plates-formes et quand j'imprime. Pour rendre le texte, j'ai essayé d'utiliser les méthodes drawPath() et drawPolygon() de QPainter.Le texte QPainterPath est incorrect lors de l'impression

OS X 10.11.6:

  • drawPath: ligne haut dans le texte Indic présente des lacunes qui ne devrait pas être là, à la fois dans un QGraphicsView et quand j'imprimer.
  • drawPolygon: la ligne supérieure est solide comme il se doit, à la fois dans un QGraphicsView et lorsque j'imprime. Cependant, une fois imprimé, j'obtiens beaucoup de lignes fines entre différents points aléatoires dans le texte.

fenêtre 7:

  • drawPath: même que sur le Mac: il y a des lacunes en première ligne, à la fois la QGraphicsView et quand j'imprimer.
  • drawPolygon: le QGraphicsView est correct (pas d'espace vide), mais l'impression présente toujours les espaces vides dans la ligne supérieure, même si elle n'a pas les lignes fines comme imprimées sur le Mac. Donc, l'impression avec drawPolygon produit une sortie incorrecte identique à l'impression avec drawPath.

Here's Un exemple d'application qui illustre ces problèmes. Voici le code de peinture de mon QGraphicsItem sous-classe dans mon exemple d'application:

void MapGraphicsTextElement::paint(QPainter *painter, 
            const QStyleOptionGraphicsItem * /*option*/, 
            QWidget * /*widget*/) { 

    painter->setFont(font_); 
    painter->setRenderHint(QPainter::Antialiasing); 
    painter->setBrush(QBrush(QColor(Qt::black))); 
    painter->setPen(Qt::NoPen); 

    QPainterPath path; 
    path.addText(0, 0, font_, text_); 

    if (fix_gaps_) { 
    QPolygonF poly = path.toFillPolygon(); 
    painter->drawPolygon(poly, Qt::WindingFill); 
    } else { 
    painter->drawPath(path); 
    } 
} 

Voici le code de l'exemple d'application qui crée la scène et ajoute deux de mes QGraphicsItem objets de sous-classe à la scène:

QGraphicsScene * PrintsLines::CreateScene() 
{ 
    QGraphicsScene *scene = new QGraphicsScene(0, 0, 500, 500, this); 

    QScopedPointer<MapGraphicsTextElement> item(new MapGraphicsTextElement()); 

    item->SetText("My test text here."); 
    item->SetFixGaps(fix_gaps_->isChecked()); 
    QFont item_font("Arial"); 
    item_font.setPixelSize(12); 
    item->SetFont(item_font); 
    item->setPos(128, 115); 
    scene->addItem(item.take()); 

    QScopedPointer<MapGraphicsTextElement> item2(new MapGraphicsTextElement()); 

    item2->SetText("मेदितेरेनियन सि"); 
    item2->SetFixGaps(fix_gaps_->isChecked()); 
    QFont item_font2("Arial"); 
    item_font2.setPixelSize(48); 
    item2->SetFont(item_font2); 
    item2->setPos(128, 215); 
    scene->addItem(item2.take()); 

    return scene; 
} 

Comment puis-je faire ce qui est rendu dans un QGraphicsView et est imprimé sont identiques et corrects? Si différentes solutions sont nécessaires pour OS X et Windows, c'est OK. Ou si une nouvelle version de Qt est nécessaire pour résoudre ce problème, je pourrais mettre à niveau Qt.

MISE À JOUR:

Comme suggéré Kuba Ober, je l'ai démontré les bugs d'impression avec cette application simple ci-dessous. Je ne suis pas sûr de savoir comment procéder à partir d'ici.

#include <QApplication> 

#include <QtGui/QPainter> 
#include <QtGui/QPainterPath> 
#include <QtGui/QFont> 
#include <QtPrintSupport/QPrintDialog> 
#include <QtPrintSupport/QPrinter> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QPrinter *printer = new QPrinter(); 
    QPrintDialog dialog(printer); 
    if (dialog.exec() == QDialog::Accepted) { 
    QFont font("Arial"); 
    font.setPointSize(48); 

    QPainter painter(printer); 
    painter.setFont(font); 
    painter.setRenderHint(QPainter::Antialiasing); 
    painter.setBrush(QBrush(QColor(Qt::black))); 
    painter.setPen(Qt::NoPen); 

    // drawPath() 
    QPainterPath path_drawPath; 
    path_drawPath.addText(100, 200, font, "मेदितेरेनियन सि"); 
    painter.drawPath(path_drawPath); 

    // drawPolygon() 
    QPainterPath path_drawPoly; 
    path_drawPoly.addText(100, 300, font, "मेदितेरेनियन सि"); 
    QPolygonF poly = path_drawPoly.toFillPolygon(); 
    painter.drawPolygon(poly, Qt::WindingFill); 
    } 

    return 0; 
} 
+0

Tout comportement variant d'une plateforme à l'autre est un bogue Qt car sur les deux plates-formes tout le rendu à l'écran est effectué par la plateforme raster et les résultats doivent être identiques pour les pixels. –

+0

Le rendu à l'écran est identique sur les deux plates-formes, mais les erreurs d'impression sont différentes. –

+0

Au lieu d'utiliser la scène graphique, réduisez le code à un seul 'main()' avec 'QPainter'. Si le problème persiste, il s'agit probablement d'un bug de moteur de peinture d'impression. –

Répondre

0

painter.drawText() fonctionne pour l'impression et la création de fichiers PDF. painter.drawPolygon() fonctionne pour le rendu à l'écran et la sortie des images raster (png & jpg). Cette solution de contournement semble être suffisante pour résoudre mon problème.