【问题标题】:Keeping a heading with next paragraph in QTextDocument在 QTextDocument 中保留下一段的标题
【发布时间】:2021-10-18 02:19:45
【问题描述】:

我正在学习如何在 PySide6 中使用QTextDocument,它似乎具有显示富文本的大部分功能,但我看不到如何将标题与下一段保持一致。

在此示例中,“标题 13”位于第 2 页的底部,其下一段位于第 3 页的顶部。如何将“标题 13”移动到第 3 页以使它们保持在一起?段落中间的分页符不会打扰我,我只是不喜欢一个标题本身。

from PySide6.QtGui import QPdfWriter, QPageSize, QTextDocument, QTextCursor
from PySide6.QtWidgets import QApplication


app = QApplication()
pdf = QPdfWriter('example.pdf')
pdf.setPageSize(QPageSize.Letter)

document = QTextDocument()
cursor = QTextCursor(document)
cursor.insertHtml('<h1>Title</h1>')
for i in range(1, 21):
    cursor.insertText('\n')
    cursor.insertHtml(f'<h3>Heading {i}</h3>')
    cursor.insertText('\n')
    cursor.insertHtml('<p>Lorem ipsum dolor sit amet, consectetur '
                      'adipiscing elit. Aliquam sed congue mauris. '
                      'Curabitur a lobortis odio. Maecenas non metus id '
                      'sapien congue sagittis quis ac ipsum. Sed ut '
                      'tincidunt ex. Proin sed neque at nunc sollicitudin '
                      'sagittis eget molestie mauris. Integer condimentum '
                      'lacus quis enim scelerisque, at cursus orci porta. '
                      'Aenean non tellus arcu. Sed quis odio turpis. '
                      'Vivamus facilisis.</p>')
document.print_(pdf)

【问题讨论】:

    标签: python pyside6 qtextdocument


    【解决方案1】:

    例如,你想这样做吗?

    import PySide6
    from PySide6.QtGui import QPdfWriter, QPageSize, QTextDocument, QTextCursor
    from PySide6.QtWidgets import QApplication
    import sys, os, re
    dirname  =  os.path.dirname(PySide6.__file__)
    plugin_path  =  os.path.join(dirname, 'plugins', 'platforms')
    os.environ['QT_QPA_PLATFORM_PLUGIN_PATH']  =  plugin_path
    app = QApplication()
    pdf = QPdfWriter('example.pdf')
    pdf.setPageSize(QPageSize.Letter)
      
    document = QTextDocument()
    cursor = QTextCursor(document)
    cursor.insertHtml('<h1>Title</h1>')
        
    document.setPageSize(QPageSize.size(QPageSize.A4, QPageSize.Point))
    pagesize = document.pageSize()
    pagecount = 0
    bottom = 0
    average_height = 0
    pagebreak = False
    for i in range(1, 21):
        firstinsert_rect = document.documentLayout().blockBoundingRect(document.findBlockByNumber(cursor.block().blockNumber()))
        pagecount = int(document.documentLayout().blockBoundingRect(document.findBlockByNumber(cursor.block().blockNumber())).y()/pagesize.height()) + 1
        if pagecount != int((bottom + average_height)/pagesize.height()) + 1:
            bf = cursor.blockFormat()
            bf.setPageBreakPolicy(bf.PageBreak_AlwaysAfter)
            cursor.setBlockFormat(bf)
            pagebreak = True
        cursor.insertText('\n')
        if pagebreak:
            pagebreak = False
            bf = cursor.blockFormat()
            bf.setPageBreakPolicy(bf.PageBreak_Auto)
            cursor.setBlockFormat(bf)
        cursor.insertHtml(f'<h3>Heading {i}</h3>')
        cursor.insertText('\n')
        cursor.insertHtml('<p>Lorem ipsum dolor sit amet, consectetur '
                              'adipiscing elit. Aliquam sed congue mauris. '
                              'Curabitur a lobortis odio. Maecenas non metus id '
                              'sapien congue sagittis quis ac ipsum. Sed ut '
                              'tincidunt ex. Proin sed neque at nunc sollicitudin '
                              'sagittis eget molestie mauris. Integer condimentum '
                              'lacus quis enim scelerisque, at cursus orci porta. '
                              'Aenean non tellus arcu. Sed quis odio turpis. '
                              'Vivamus facilisis.</p>')
        lastinsert_rect = document.documentLayout().blockBoundingRect(document.findBlockByNumber(cursor.block().blockNumber()))
        average_height = lastinsert_rect.bottom() - firstinsert_rect.y()
        bottom = lastinsert_rect.bottom()
            
    document.print_(pdf)
    

    【讨论】:

    • 感谢您的回答。我不太确定,但看起来你正在做一些自定义布局计算。我会很感激你的策略的简要描述,或者一些文档的链接来帮助我弄清楚。我也希望 QTextDocument 能提供一种更简单的方法。
    • 说到我回答的结果,是否达到你的目的?
    • 我不使用自定义布局,它是默认布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2021-07-22
    • 2017-06-29
    • 2019-07-16
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多