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 unQGraphicsView
et quand j'imprimer.drawPolygon
: la ligne supérieure est solide comme il se doit, à la fois dans unQGraphicsView
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 laQGraphicsView
et quand j'imprimer.drawPolygon
: leQGraphicsView
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 avecdrawPolygon
produit une sortie incorrecte identique à l'impression avecdrawPath
.
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;
}
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. –
Le rendu à l'écran est identique sur les deux plates-formes, mais les erreurs d'impression sont différentes. –
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. –