Qt 5.4.2에서는 텍스트를 문자로 나눌 수 있고 곡선을 따라 렌더링 된 각 문자가 나올 수 있으므로 QPainterPath
을 사용하고 있습니다. 플랫폼과 인쇄 할 때 다른 결과가 나타납니다. 텍스트를 렌더링하려면 QPainter
의 drawPath()
및 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;
}
플랫폼에 따라 다른 동작은 Qt 버그입니다. 두 플랫폼 모두에서 화면 상 렌더링은 래스터 플랫폼에서 수행되며 동일한 글꼴이 사용되는 한 결과는 픽셀 동일해야합니다. –
화면 표시는 두 플랫폼 모두 동일하지만 인쇄 오류는 다릅니다. –
그래픽 장면을 사용하는 대신 코드를'QPainter'를 사용하여 하나의'main()'으로 최소화하십시오. 문제가 지속되면 정품 인쇄 페인트 엔진 버그 일 가능성이 큽니다. –