Разбиение на страницы QGraphicsTextItem: ограничение текста в определенной прямоугольной области

Я пытаюсь использовать Qt для создания текстового процессора WYSIWYG, уделяя основное внимание макету страниц и разбиению на страницы документа.

Первое, на чем я пытаюсь сосредоточиться, - это функция предварительного просмотра печати, и я подумал, что буду использовать QGraphicsScene/View вместе с QGraphicsTextItem.

Текущая проблема заключается в том, что я не могу содержать текст в пределах QGraphicsTextItem. Текст продолжается до тех пор, пока не достигнет нижней части QGraphicsScene/View.предварительный просмотр

Мне интересно, является ли использование QGraphics правильным способом, и если да, что я должен сделать, чтобы получить нумерацию страниц для моего текстового документа?

Код (PyQt, но я должен уметь понимать C++, хотя Python предпочтительнее) для получения результата, показанного на прилагаемой картинке:

import sys

from PyQt4.QtGui import \
QApplication, \
QDialog, \
QGraphicsScene, \
QGraphicsView, \
QVBoxLayout, \
QPainter

from PyQt4.QtCore import \
QRectF, \
Qt


class GraphicsView(QGraphicsView):
    def __init__(self, fname='', parent=None):
        super(GraphicsView, self).__init__(parent)
        self.setDragMode(QGraphicsView.RubberBandDrag)
        self.setRenderHint(QPainter.Antialiasing)
        self.setRenderHint(QPainter.TextAntialiasing)

    def wheelEvent(self, event):
        factor = 1.41 ** (-event.delta() / 240.0)
        self.scale(factor, factor)


class Editor(QDialog):

    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)

        pageSize = (842, 198)
        f = open('alotbsol.txt')
        txt = f.read()

        view = GraphicsView()
        scene = QGraphicsScene(self)
        scene.setSceneRect(0, 0, pageSize[0], pageSize[1])
        rect = QRectF(0, 0, pageSize[0], pageSize[1])
        scene.addRect(rect, Qt.black)
        textbox = scene.addText(txt)
        textbox.setTextWidth(pageSize[0])
        view.setScene(scene)

        layout = QVBoxLayout()
        layout.addWidget(view, 1)
        self.setLayout(layout)

        self.resize(scene.width() + 50, scene.height() * 2)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Editor()
    widget.show()
    app.exec_()*emphasized text*

1 ответ

Qt поддерживает обработку расширенного текста с помощью фреймворка Scribe. Он основан на QTextDocument который является контейнером для структурированных документов форматированного текста. Среда Scribe состоит из классов для чтения и работы с документами форматированного текста. Вы можете узнать больше о структурированном представлении текстового документа здесь.

Для разбиения на страницы документа при печати вы можете конвертировать текст в HTML и отображать его, используя QTextDocument, Qt's rich text engine. Хотя вы можете выполнить рисование и разрыв страницы вручную, но конвертирование документа в HTML и использование QTextDocument распечатать это, безусловно, самая удобная альтернатива для печати отчетов и других сложных документов:

void Dialog::Print(QString myText)
{

    QPrinter printer;

    QString html = QString("<P>%1</P>").arg(myText);

    QPrintDialog printDialog(&printer, this);
    if (printDialog.exec()) {
        textDocument.setHtml(html);

        QPrintPreviewDialog preview(&printer, this);
        preview.setWindowFlags ( Qt::Window );
        connect(&preview, SIGNAL(paintRequested(QPrinter *)), SLOT(printPreview(QPrinter *)));
        preview.exec();
    }

}

void Dialog::printPreview(QPrinter * printer)
{
    textDocument.print(printer);
}
Другие вопросы по тегам