2016-08-12 3 views
1

Qt 5.4.2에서는 텍스트를 문자로 나눌 수 있고 곡선을 따라 렌더링 된 각 문자가 나올 수 있으므로 QPainterPath을 사용하고 있습니다. 플랫폼과 인쇄 할 때 다른 결과가 나타납니다. 텍스트를 렌더링하려면 QPainterdrawPath()drawPolygon() 메서드를 사용하여 시도했습니다.인쇄 할 때 QPainterPath 텍스트가 잘못 렌더링됩니다.

OS X 용 10.11.6 :

  • drawPath : 인도어 텍스트의 최고 라인이 QGraphicsView에서 나는 인쇄 할 때 모두가 안 차이가 있습니다.
  • drawPolygon : 상단 라인은 반드시 QGraphicsView에 있어야하고 인쇄 할 때 반드시 있어야합니다. 그러나, 인쇄 할 때, 텍스트의 다양한 임의 지점 사이에 여분의 미세 선이 많이 있습니다.

는 윈도우 7 :

  • drawPath : Mac에서 같은 : 나는 인쇄 할 때이 외형의 차이이며, 모두 QGraphicsView합니다.
  • drawPolygon : QGraphicsView은 정확하지만 (틈이 없음) Mac에서 인쇄 할 때와 같이 여분의 미세 선은 없지만 인쇄는 여전히 맨 윗줄에 간격이 있습니다. 따라서 drawPolygon으로 인쇄하면 drawPath으로 인쇄 할 때와 동일한 잘못된 출력이 생성됩니다.

Here's 이러한 문제를 보여주는 샘플 앱.

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 서브 클래스 개체의 두 개의 추가 샘플 응용 프로그램의 코드는 다음과 같습니다 여기 내 샘플 응용 프로그램 내 QGraphicsItem 서브 클래스에서 페인트 코드는 QGraphicsView에서 렌더링되고 인쇄되는 것을 어떻게 만들 수 있습니까? 동일하고 정확합니까? OS X와 ​​Windows에서 다른 솔루션이 필요하다면 괜찮습니다. 또는이 문제를 해결하기 위해 최신 버전의 Qt가 필요한 경우 Qt를 업그레이드 할 수 있습니다.

UPDATE : 쿠바의 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; 
} 
+0

플랫폼에 따라 다른 동작은 Qt 버그입니다. 두 플랫폼 모두에서 화면 상 렌더링은 래스터 플랫폼에서 수행되며 동일한 글꼴이 사용되는 한 결과는 픽셀 동일해야합니다. –

+0

화면 표시는 두 플랫폼 모두 동일하지만 인쇄 오류는 다릅니다. –

+0

그래픽 장면을 사용하는 대신 코드를'QPainter'를 사용하여 하나의'main()'으로 최소화하십시오. 문제가 지속되면 정품 인쇄 페인트 엔진 버그 일 가능성이 큽니다. –

답변

0

painter.drawText()은 인쇄 및 PDF의를 만들기 위해 노력하고 있습니다. painter.drawPolygon()은 스크린 렌더링 및 래스터 이미지 출력을 위해 작동합니다 (png & jpg). 이 해결 방법은 내 문제를 해결하기에 충분합니다.

관련 문제