QPainterPath 文本在打印时呈现错误
QPainterPath text renders wrong when printing
在 Qt 5.4.2 中,我使用 QPainterPath
来渲染文本,因为文本可能会被分割成字符并且每个字符都沿着一条曲线渲染。我在不同平台和打印时看到不同的结果。为了呈现文本,我尝试使用 QPainter
的 drawPath()
和 drawPolygon()
方法。
OS X 10.11.6:
drawPath
:印度文本中的第一行有不应该存在的间隙,无论是在 QGraphicsView
中还是在我打印时。
drawPolygon
:顶行在 QGraphicsView
和我打印时都是实心的。但是,在打印时,我在文本中的各个随机点之间得到了很多额外的细线。
Window 7:
drawPath
:与 Mac 相同:顶行有空隙,QGraphicsView
和我打印时。
drawPolygon
:QGraphicsView
是正确的(没有间隙),但是打印在顶行仍然有间隙,尽管它没有像在 Mac。因此,使用 drawPolygon
打印会产生与使用 drawPath
. 打印相同的错误输出
Here's 演示这些问题的示例应用程序。这是我的示例应用程序中 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) 工作。此解决方法似乎足以解决我的问题。
在 Qt 5.4.2 中,我使用 QPainterPath
来渲染文本,因为文本可能会被分割成字符并且每个字符都沿着一条曲线渲染。我在不同平台和打印时看到不同的结果。为了呈现文本,我尝试使用 QPainter
的 drawPath()
和 drawPolygon()
方法。
OS X 10.11.6:
drawPath
:印度文本中的第一行有不应该存在的间隙,无论是在QGraphicsView
中还是在我打印时。drawPolygon
:顶行在QGraphicsView
和我打印时都是实心的。但是,在打印时,我在文本中的各个随机点之间得到了很多额外的细线。
Window 7:
drawPath
:与 Mac 相同:顶行有空隙,QGraphicsView
和我打印时。drawPolygon
:QGraphicsView
是正确的(没有间隙),但是打印在顶行仍然有间隙,尽管它没有像在 Mac。因此,使用drawPolygon
打印会产生与使用drawPath
. 打印相同的错误输出
Here's 演示这些问题的示例应用程序。这是我的示例应用程序中 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) 工作。此解决方法似乎足以解决我的问题。