Как создать PDF-файлы из QGraphicsScene с копируемым текстом? - PullRequest
17 голосов
/ 12 декабря 2011

Мой код создает pdf путем рендеринга содержимого QGraphicsScene на правильно инициализированный QPrinter. При работе с приложением такой текст можно редактировать, копировать в буфер обмена и т. Д. Как я могу создать pdf из QGraphicsScene, где моя текстовая строка также может быть скопирована, или это невозможно, и мне нужно создать QTextDocument для таких задач?

QGraphicsTextItem* textItem = new QGraphicsTextItem ( text );

textItem->setPlainText ( text );
textItem->setTextInteractionFlags ( Qt::TextEditorInteraction );
textItem->setFlags( QGraphicsItem::ItemIsSelectable | textItem->flags() );

scene->addItem( textItem );

QPrinter pdfPrinter; 
pdfPrinter.setOutputFormat( QPrinter::PdfFormat );
pdfPrinter.setPaperSize( QSize(scene->width(), scene->height()), QPrinter::Point );
pdfPrinter.setFullPage(true);
pdfPrinter.setOutputFileName( path );

QPainter pdfPainter;
pdfPainter.begin( &pdfPrinter);
scene->render( &pdfPainter );
pdfPainter.end();

1 Ответ

3 голосов
/ 28 декабря 2011

Кажется, что вы должны использовать QTextDocument и писать свой контент в формате HTML. Смотрите мой ответ и мои комментарии к вопросу: Qt4: Распечатать таблицу SQL в PDF

РЕДАКТИРОВАТЬ: я сделал сеанс отладки (с Visual Studio в Windows7) и вошел в scene-> render. На каком-то этапе вызывается QGraphicsTextItem :: paint (...) в файле qgraphicsitem.cpp (строка 10067 в Qt 4.8.0), где вы можете видеть, что текстовый элемент хранится в QTextDocument.

Мой вывод (из указанного вопроса): текст печатается в виде текста в документе pdf, что означает, что ваша неспособность выбрать или скопировать текст является всего лишь артефактом вашего средства просмотра PDF. Если для вашей платформы доступен xpdf, включая pdftotext, вы можете легко это проверить.

...