В Qt 5.4.2 я использую QPainterPath
для рендеринга текста, поскольку текст может быть разбит на символы, и каждый символ отображается по кривой. Я вижу разные результаты на разных платформах и при печати. Чтобы отобразить текст, я пробовал использовать методы drawPath()
и drawPolygon()
QPainter
.
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.
ОБНОВИТЬ:
Как предложил Куба Обер, ниже я продемонстрировал ошибки печати с помощью этого простого приложения. Я не уверен, как действовать дальше.
#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;
}
main()
сQPainter
. Если проблема не устранена, скорее всего, это подлинная ошибка механизма печати. - person Kuba hasn't forgotten Monica   schedule 16.08.2016painter.drawText()
в качестве обходного пути. Пока похоже, что я могу решить эту проблему для обеих платформ, используяdrawText()
для печати и создания PDF-файлов, и используяpainter.drawPolygon()
для рендеринга на экране. Я предполагаю, что для моих изогнутых текстов мне придется вызыватьdrawText()
отдельно для каждого символа... и надеюсь, что это заметно повлияет на производительность. - person David Burson   schedule 16.08.2016