как распечатать QGraphicsScene, который имеет текст и графику - PullRequest
3 голосов
/ 09 сентября 2010

У меня есть QGraphicsScene, на котором нарисована графика и текст. Когда я пытаюсь печатать, графика в порядке, но текст использует размер шрифта, определенный в точках, поэтому scene->render(), когда я передаю ему QPainter, инициализированный QPrinter, имеет ОЧЕНЬ большой текст.

Как я должен напечатать QGraphicsScene, на котором есть текст?

редактирование:

Вот мой текущий код печати, где scene_ - мой пользовательский подкласс QGraphicsScene:

  QPrinter printer(QPrinter::HighResolution);
  QPrintDialog dialog(&printer, this);
  dialog.exec();
  std::cout << printer.resolution() << std::endl;
  QPainter painter(&printer);
  scene_->render(&painter);

Строка std: cout, похоже, не имеет никакого значения. Принтер все еще думает, что текст огромен, поэтому для каждого текстового элемента печатается только крошечная часть первой буквы.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2010

Из QPrinter документов звучит так, будто вам нужно указать размеры шрифта в пикселях, чтобы текст и графика соответствовали друг другу. Обратите внимание, что QFont имеет метод setPixelSize.

1 голос
/ 10 сентября 2010

Настройка QPrinter:

По умолчанию объект QPrinter инициализируется с разрешением экрана (обычно 96 DPI), если вы не укажете QPrinter::HighResolution в конструкторе, который затемиспользуйте разрешение используемого принтера.

Если вы настраиваете объект QPrinter, используя QPrintDialog, тогда код должен выглядеть примерно так:

QPrinter printer(QPrinter::HighResolution);
QPrintDialog dialog(&printer, this);
dialog.exec();
std::cout << printer.resolution() << std::endl;

После этого программа должна вывести DPI DPIвыбранный принтер.В моем случае он печатает 600.

Если вы не используете QPrintDialog, вы должны использовать конструктор QPrinter, как показано выше, а затем вызвать setResolution(DPI) с известным DPI вашего принтера.

Это должно привести к тому, что шрифты будут правильно отображаться.

Обновление:

Теперь, когда выходные уже здесь, у меня наконец-то появилось время, чтобы правильно рассмотретьэта проблема :) Хотя это технически правильно для настройки QPrinter, вышеупомянутое решение не практично для графических сцен, которые включают текст, указанный в размерах точек.Поскольку все графические элементы указаны в пиксельных координатах, имеет смысл указывать только размеры шрифта в пикселях, чтобы гарантировать, что шрифты выглядят точно так, как ожидается, при смешивании с другими графическими примитивами.

Нет необходимости беспокоитьсяо размере текста на разных мониторах, поскольку сами графические элементы не зависят от разрешения.Представление может указывать масштабные переводы для работы с мониторами с различным разрешением и разрешением.

При печати QPrinter по умолчанию масштабируется, чтобы подогнать всю сцену к странице.Это имеет смысл, поскольку квадрат 100 x 100 на принтере с разрешением 600 точек на дюйм будет иметь ширину 1/6 дюйма на бумаге:)

...