python — разбиение на страницы 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, \
Qtclass 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 поддерживает обработку расширенного текста Писец рамки. Он основан на QTextDocument который является контейнером для структурированных документов в формате RTF. Среда 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);
}
1

Другие решения


По вопросам рекламы [email protected]