Я пишу программу, которая, помимо прочего, создает еженедельное расписание в стиле Outlook (дни недели вверху, время внизу слева и поля в сетке для представления встреч). Я создал подкласс класса QGraphicsScene и использую его вместе с QGraphicsView для отображения расписания в графическом интерфейсе.
Проблема возникает сейчас, когда я пытаюсь распечатать расписание. Я хотел бы, чтобы это распечатывало и автоматически масштабировалось, чтобы соответствовать странице. Из проведенного мною исследования код должен быть относительно простым:
QPrinter printer( QPrinter::HighResolution );
if( QPrintDialog( &printer ).exec() == QDialog::Accepted )
{
QPainter painter( &printer );
schedule_scene->render( &painter );
}
Тем не менее, это приводит к выводу с текстовыми метками, застрявшими в верхнем левом углу и без видимых блоков / линий сетки, как если бы он пытался отобразить сцену в невероятно крошечном блоке. Если я сделаю следующее изменение:
schedule_scene->render( &painter, QRectF( 0, 0, 600, 600 ) );
затем он печатается в маленькой коробке 600×600, как и ожидалось.
Я тестировал это как на принтере Windows XPS, так и на принтере CutePDF, так как сейчас у меня нет реального принтера, подключенного к моей машине для разработки.
Согласно проведенному мною исследованию, QGraphicsScene должен масштабироваться, чтобы заполнить страницу всеми параметрами по умолчанию. Почему моя подклассовая сцена не будет автоматически масштабироваться по размеру всей страницы? Я пропустил метод, который мне нужно было реализовать?
РЕДАКТИРОВАТЬ: Установка размера страницы вручную в коде устраняет проблему:
QPrinter printer( QPrinter::HighResolution );
if( QPrintDialog( &printer ).exec() == QDialog::Accepted )
{
printer.setPageSize( QPagedPaintDevice::PageSize::Letter );
QPainter painter( &printer );
schedule_scene->render( &painter );
}
Почему диалоговое окно «Печать» не заботится о настройке размера страницы самостоятельно?
Задача ещё не решена.
Других решений пока нет …