QPainterPath文本在打印时呈现错误
QPainterPath text renders wrong when printing
在Qt 5.4.2中,我使用QPainterPath
来呈现文本,因为文本可以分成字符,每个字符沿着曲线呈现。我在不同平台和打印时看到不同的结果。为了渲染文本,我尝试使用QPainter
的drawPath()
和drawPolygon()
方法。
OS X 10.11.6:
-
drawPath
:在印度文本的顶行有空白,不应该在那里,无论是在QGraphicsView
和当我打印。 -
drawPolygon
:顶行是实心的,因为它应该是,无论是在QGraphicsView
和当我打印。但是,在打印时,我在文本中的各个随机点之间得到了许多额外的细线。
窗口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
子类对象添加到场景中:
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)。这个方法似乎足以解决我的问题。
相关文章:
- 使用 <list> (错误 C2760) 打印队列的元素
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 我编写了以下代码来读取C++矩阵,然后打印其行和列.我收到此错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- 错误含义;以二进制形式打印数字
- 通过基类引用派生类后打印的错误值
- 如何在没有打印语句的情况下报告用户输入错误
- 为什么没有打印错误消息
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 错误:变量或字段'PrintEntity'声明无效无效打印实体(实体 e);
- 将矢量的整数内容打印为字符串会导致分割错误
- 为什么我的C++代码在以下打印链表的代码片段中显示分段错误?
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- Python - 从 c++ DLL 错误打印值
- 使用std :: String ptr的错误打印std :: String
- 枚举类的GoogleTest测试错误打印
- 分段错误:打印动态数组时为 11
- Ustring错误(打印期间)