2016-08-12 13 views
1

Qt 5.4.2では、テキストを文字に分割し、各文字を曲線に沿ってレンダリングするため、QPainterPathを使用しています。プラットフォーム間や印刷時に異なる結果が見られます。テキストをレンダリングするために、私はQPainterdrawPath()drawPolygon()メソッドを使ってみました。印刷時にQPainterPathテキストが正しくレンダリングされない

OS X 10.11.6:

  • drawPath:インド語テキストのトップラインはQGraphicsViewにし、ときに私は印刷の両方、存在しないはずのギャップを持っています。
  • drawPolygon:一番上の行は、QGraphicsViewと印刷時の両方で実線で表示されます。しかし、印刷すると、テキストのさまざまなランダムな点の間にたくさんの細かい線ができます。

窓7:

  • drawPath:Macで同じ:トップラインにおけるギャップがQGraphicsViewときI印刷の両方があります。
  • drawPolygonQGraphicsViewは正しいですが(ギャップはありません)、Macに印刷したときと同じように余分な細い線はありませんが、先頭行にはまだギャップがあります。したがって、drawPolygonでの印刷は、drawPathでの印刷と同じ不正な出力を生成します。

Here'sこれらの問題を示すサンプルアプリ。ここに私のサンプルアプリで私の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; 
} 

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つを追加したサンプルアプリからのコードですQGraphicsViewでレンダリングされ、印刷されたものを同じで正しいものにする方法はありますか? OS XとWindowsで異なる解決策が必要な場合は、問題ありません。または、これを解決するためにQtの新しいバージョンが必要な場合は、私はQtをアップグレードすることができます。

UPDATE:クバオバーが示唆したように

、私は以下のこの単純なアプリで印刷バグを実証しています。私はここから進める方法がわかりません。

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

プラットフォームによって異なる動作は、両方のプラットフォームのQtバグです。画面上でのレンダリングはすべてラスタープラットフォームで行われ、同じフォントが使用されている限り、結果はピクセルで一致する必要があります。 –

+0

画面上のレンダリングは両方のプラットフォームで同じですが、印刷エラーは異なります。 –

+0

グラフィックシーンを使用する代わりに、 'QPainter'を使ってコードを単一の' main() 'に最小化してください。問題が解決しない場合は、本物のプリントペイントエンジンのバグでしょう。 –

答えて

0

painter.drawText()は、印刷とpdfの作成のために働いています。 painter.drawPolygon()は、画面上でのレンダリングとラスターイメージの出力を行います(png & jpg)。この回避策は、私の問題を解決するのに十分なようです。

関連する問題