python - QGraphicsTextItem 的分页 : Confining text to a specific rectangular area

标签 python c++ qt pagination qgraphicstextitem

我正在尝试使用 Qt 创建所见即所得的文字处理器,主要关注页面布局和文档分页。

我首先要关注的是打印预览功能,我想我会使用 QGraphicsScene/View 和 QGraphicsTextItem。

当前的问题是我无法将文本包含在 QGraphicsTextItem 的范围内。文本一直继续,直到它到达 QGraphicsScene/View 的底部。 Preview

我想知道使用 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*

最佳答案

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);
}

关于python - QGraphicsTextItem 的分页 : Confining text to a specific rectangular area,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120201/

相关文章:

python - 从只有网站 url 的元标记和 img url 中提取值。为 django 应用程序用 python 编写

python - 向服务器上的 git 存储库添加一层身份验证

Python Discord,检查成员(member)状态

c++ - C++/Qt 中的闭合轮廓

Python 列表不能使用代理调用

c++,类成员数组不保持其值(value)

c++ - Rcpp:将两个 NumericVectors 相乘,同时对其中一个进行子集化

c++ - 子字符串输出不符合预期?

c++ - 通过为每个对等方创建新套接字来执行 Ping

python - 在不添加到菜单(或工具栏)的情况下使用 QAction