Qt 5.4.2では、テキストを文字に分割し、各文字を曲線に沿ってレンダリングするため、QPainterPath
を使用しています。プラットフォーム間や印刷時に異なる結果が見られます。テキストをレンダリングするために、私はQPainter
のdrawPath()
とdrawPolygon()
メソッドを使ってみました。印刷時にQPainterPathテキストが正しくレンダリングされない
OS X 10.11.6:
drawPath
:インド語テキストのトップラインはQGraphicsView
にし、ときに私は印刷の両方、存在しないはずのギャップを持っています。drawPolygon
:一番上の行は、QGraphicsView
と印刷時の両方で実線で表示されます。しかし、印刷すると、テキストのさまざまなランダムな点の間にたくさんの細かい線ができます。
窓7:
drawPath
:Macで同じ:トップラインにおけるギャップがQGraphicsView
ときI印刷の両方があります。drawPolygon
:QGraphicsView
は正しいですが(ギャップはありません)、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;
}
プラットフォームによって異なる動作は、両方のプラットフォームのQtバグです。画面上でのレンダリングはすべてラスタープラットフォームで行われ、同じフォントが使用されている限り、結果はピクセルで一致する必要があります。 –
画面上のレンダリングは両方のプラットフォームで同じですが、印刷エラーは異なります。 –
グラフィックシーンを使用する代わりに、 'QPainter'を使ってコードを単一の' main() 'に最小化してください。問題が解決しない場合は、本物のプリントペイントエンジンのバグでしょう。 –