2013-08-21 4 views
2

У меня есть виджет QPlainTextEdit, который содержит текст, введенный пользователем. Текст может содержать символы \ n или все они могут быть на одной очень длинной строке. Моя цель - напечатать этот текст на принтере (на бумаге) с переносом слов. Функции QPlainTextEdit :: print() и QTextDocument :: print() мне не подходят, потому что они оба печатают номер страницы в нижней части страницы, чего я не хочу, а во-вторых, я не могу показаться иметь возможность контролировать, какие страницы печатать (например, если пользователь хочет распечатать страницу № 2 из 5 страниц) - весь документ всегда печатается.Печать обычного текста на принтер (бумага)

В основном я использую объект QPainter для рисования текста на принтере. Основная трудность, с которой я столкнулся, - это определить, когда вызывать функцию QPrinter :: newPage(). Как вы определяете, сколько текста поместится на странице? Если текст находится на одной длинной строке, а строка обертывается словом, откуда вы знаете, когда первая страница заполнена и когда начинается вторая страница? Я использую следующий код для рисования:

painter.drawText(printer->pageRect(), Qt::TextWordWrap, ui->plainTextEdit->toPlainText()); 

художник типа QPainter; принтер имеет тип QPrinter; plainTextEdit имеет тип QPlainTextEdit.

+0

вам может понадобиться QFontMetrics, чтобы получить размер текста. – Kunal

ответ

0

Чтобы получить вертикальный размер текста, позвоните painter.boundingRect(painter.window(), myText).height();. Когда это превышает painter.window.height(), пришло время позвонить newPage().

Теперь речь идет только о создании вашего текста по слову, пока высота ограничивающей высоты не превысит высоту страницы. Я бы предложил сохранить «безопасный» QString, который, как вы знаете, поместится на странице и «небезопасный» QString, к которому вы только что добавили новое слово. Если новое слово не превышает высоту, назначьте безопасную строку небезопасной. (Qt имеет некоторые оптимизации, такие как совместное копирование, чтобы это не слишком интенсивно вычислялось).

Чтобы разобраться с отдельными словами в QString, вам нужно будет играть с indexOf() или split(), используя их варианты QRegExp, чтобы вы могли искать пробелы, такие как пробелы, вкладки, символы новой строки.

Вам нужно будет отчитаться за одно «слово», которое само по себе не поместится на странице, и разделит его на среднее слово. В деталях могут быть и другие дьяволы, но, надеюсь, вы добьетесь начала.

Смежные вопросы