QPainterPath文本在打印时呈现错误

QPainterPath text renders wrong when printing

本文关键字:错误 打印 文本 QPainterPath      更新时间:2023-10-16

在Qt 5.4.2中,我使用QPainterPath来呈现文本,因为文本可以分成字符,每个字符沿着曲线呈现。我在不同平台和打印时看到不同的结果。为了渲染文本,我尝试使用QPainterdrawPath()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。

更新:

正如Kuba Ober建议的那样,我已经用下面这个简单的应用程序演示了打印错误。我不知道如何从这里开始。

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

painter.drawText()正在为打印和创建pdf工作。painter.drawPolygon()正在为屏幕渲染和输出光栅图像(png &jpg)。这个方法似乎足以解决我的问题。