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

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

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

person David Burson    schedule 12.08.2016    source источник
comment
Любое поведение, которое различается между платформами, является ошибкой Qt, поскольку на обеих платформах весь рендеринг на экране выполняется растровой платформой, и результаты должны быть идентичны по пикселям, если используются одни и те же шрифты.   -  person Kuba hasn't forgotten Monica    schedule 15.08.2016
comment
Рендеринг на экране идентичен на обеих платформах, но ошибки печати различаются.   -  person David Burson    schedule 16.08.2016
comment
Вместо использования графической сцены сверните код до одного main() с QPainter. Если проблема не устранена, скорее всего, это подлинная ошибка механизма печати.   -  person Kuba hasn't forgotten Monica    schedule 16.08.2016
comment
Я экспериментирую с painter.drawText() в качестве обходного пути. Пока похоже, что я могу решить эту проблему для обеих платформ, используя drawText() для печати и создания PDF-файлов, и используя painter.drawPolygon() для рендеринга на экране. Я предполагаю, что для моих изогнутых текстов мне придется вызывать drawText() отдельно для каждого символа... и надеюсь, что это заметно повлияет на производительность.   -  person David Burson    schedule 16.08.2016
comment
Я имею в виду надежду, что НЕТ заметного снижения производительности.   -  person David Burson    schedule 17.08.2016


Ответы (1)


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

person David Burson    schedule 22.08.2016