我正在尝试使用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*
答案 0 :(得分:1)
Qt支持The Scribe framework的富文本处理。它基于QTextDocument
,它是结构化富文本文档的容器。 Scribe框架包含用于读取和操作富文本文档的类。您可以找到有关文本文档here的结构化表示的更多信息。
为了在打印时对文档进行分页,您可以将文本转换为HTML并使用Qt的富文本引擎QTextDocument
进行渲染。虽然您可以手动执行绘图和分页,但将文档转换为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);
}