1

Qt 5.4.2 では、QPainterPathテキストをレンダリングするために を使用しています。これは、テキストが文字に分割され、各文字が曲線に沿ってレンダリングされる可能性があるためです。プラットフォーム間および印刷時に異なる結果が表示されます。テキストをレンダリングするために、とメソッドQPainterを使用してみました。drawPath()drawPolygon()

OS X 10.11.6:

  • drawPath: インド語のテキストの一番上の行には、印刷時と印刷時の両方で、あってはならないギャップがありQGraphicsViewます。
  • drawPolygonQGraphicsView: 一番上の行は、印刷時と印刷時の両方で、あるべき姿でしっかりしています。ただし、印刷すると、テキスト内のさまざまなランダムなポイントの間に極細の線がたくさん表示されます。

ウィンドウ 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シーンを作成し、2 つのサブクラス オブジェクトをシーンに追加するサンプル アプリのコードを次に示します。

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

1 に答える 1

0

painter.drawText()印刷とpdfの作成に取り組んでいます。 painter.drawPolygon()オンスクリーン レンダリングとラスター イメージ (png & jpg) の出力に取り組んでいます。この回避策は、私の問題を解決するのに十分なようです。

于 2016-08-22T18:57:33.843 に答える