QPainterPath текст отображается неправильно при печати

В Qt 5.4.2 я использую QPainterPath для визуализации текста, так как текст может быть разбит на символы, и каждый символ отображается вдоль кривой. Я вижу разные результаты на разных платформах и при печати. Чтобы сделать текст, я попытался использовать QPainter«s drawPath() а также drawPolygon() методы.

OS X 10.11.6:

  • drawPath: верхняя строка в индийском тексте имеет пробелы, которых не должно быть, как в QGraphicsView и когда я печатаю.
  • drawPolygon: верхняя линия сплошная, как и должно быть, как в QGraphicsView и когда я печатаю. Однако при печати я получаю множество дополнительных тонких линий между различными случайными точками в тексте.

Окно 7:

  • drawPath: так же, как на Mac: в верхней строке есть пробелы, оба QGraphicsView и когда я печатаю.
  • drawPolygon: QGraphicsView является правильным (без пропусков), но печать все еще имеет пропуски в верхней строке, хотя и не имеет дополнительных тонких линий, как при печати на Mac. Так что печать с drawPolygon выдает такой же неверный вывод, как при печати с drawPath,

Вот пример приложения, которое демонстрирует эти проблемы. Вот код краски от моего QGraphicsItem подкласс в моем примере приложения:

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);
}
}

Вот код из примера приложения, которое создает сцену и добавляет два моих QGraphicsItem Подкласс объектов на сцене:

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;
}

Как я могу сделать то, что отображается в QGraphicsView а напечатано ли идентично и правильно? Если для OS X и Windows требуются разные решения, это нормально. Или, если для решения этой проблемы потребуется более новая версия Qt, я мог бы обновить Qt.

ОБНОВИТЬ:

Как предложил Куба Обер, я продемонстрировал ошибки печати с помощью этого простого приложения ниже. Я не уверен, что делать дальше.

#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;
}

1

Решение

painter.drawText() работает для печати и для создания PDF. painter.drawPolygon() работает для рендеринга на экране и вывода растровых изображений (png & JPG). Этот обходной путь представляется достаточным для решения моей проблемы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]