[PySide] QGraphicsTextItem

Zfox Atis zfoxatis at gmail.com
Sat Oct 6 13:12:25 CEST 2012


I also like things trying.(this works but is not the final) Maybe it will
give you some ideas:
(http://pastebin.com/S2mj1ZS2 )

class ReportPage(QFrame):
    ''' report rootclass
        create multi-page finance report: dynamic height of the header and
footer'''
    def __init__(self):
        super(ReportPage,self).__init__()

        self.printer=QPrinter()
        self.printer.setPaperSize(QPrinter.A4)
        self.printer.setPageMargins(40,30,40,10,QPrinter.Point)
        self.rootEditorTextEdit=QTextEdit()

        self.createReport()
        self.reportGui()

    def reportGui(self):pass # ...create printpreview widget

    def createReport(self):

        self.doc=self.rootEditorTextEdit.document()
        self.doc.setUseDesignMetrics(True)
        self.doc.setPageSize(QSizeF(793,1123)) #(A/4)
        self.doc.setDocumentMargin(0)

        self.rootTextCursor = QTextCursor(self.doc)

        self.pageBreakTextBlockFormat=QTextBlockFormat()

self.pageBreakTextBlockFormat.setPageBreakPolicy(QTextFormat.PageBreak_AlwaysBefore)

        # document fragments:
        self.firstPageHeader=None
        self.docTitle=None
        self.docPrologText=None
        self.notFirstPageHeader=None
        self.docDetailHeader=None
        self.detailitems=[]
        self.detailSummary=None
        self.docEndText=None
        self.docEndFooter=None
        self.pageFooter=None

        self.reportPartDefinition()
        self.reportCompilation()

    def reportPartDefinition(self):pass #child class create to document
fragments


    def reportCompilation(self):
        self.max_page_height=self.printer.pageRect().height()-10 # -10
point repair counting
        try:
            self.page_footer_textHeight=self.pageFooter.textHeight()
        except:
            self.page_footer_textHeight=0

        #print(self.status())

        if self.firstPageHeader:

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.firstPageHeader))

        if self.docTitle:

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docTitle))

        if self.docPrologText:

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docPrologText))

        if self.docDetailHeader:
            if
self.currentPageFreeHeightExceptFooter()<self.docDetailHeader.textHeight():
                self.pageBreak()

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))

        while len(self.detailitems):
            self.currentitem=self.detailitems.pop(0)
            if
self.currentPageFreeHeightExceptFooter()<self.currentitem.textHeight():
                self.detailPageBreak()

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.currentitem))

        if self.detailSummary:
            if
self.currentPageFreeHeightExceptFooter()<self.detailSummary.textHeight():
                self.detailPageBreak()

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.detailSummary))

        if self.docEndText:
            if
self.currentPageFreeHeightExceptFooter()<self.docEndText.textHeight():
                self.pageBreak()

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndText))

        if self.docEndFooter:
            if  self.currentPageFreeHeight()<self.docEndFooter.textHeight():
                self.pageBreak()
            print(self.currentPage())  # last page number

self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeight()-self.docEndFooter.textHeight()-18))


self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docEndFooter))

    def pageBreak(self):
        if self.pageFooter:

self.rootTextCursor.insertBlock(MyTextBlockFormat(self.currentPageFreeHeightExceptFooter()))

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.pageFooter))
        print(self.currentPage()) # current page number
        self.rootTextCursor.setBlockFormat(self.pageBreakTextBlockFormat)
        if self.notFirstPageHeader:

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.notFirstPageHeader))

    def detailPageBreak(self):
        self.pageBreak()
        if self.docDetailHeader:

self.rootTextCursor.insertFragment(QTextDocumentFragment(self.docDetailHeader))

    def currentPageFreeHeight(self):
        return
self.max_page_height-18-self.doc.size().height()%self.max_page_height
    # repair counting -18 point (Qt BUG?) blank QDocument size.height=18
point
    # and fragmentdocuments after insertion Qt don't counting rootdocument
into the heights of 18 points

    def currentPageFreeHeightExceptFooter(self):
        return self.currentPageFreeHeight()-self.page_footer_textHeight

    def currentPage(self): #calculating currentpage number

currentpagecount,fragmentpagesize=divmod(self.doc.size().height(),self.max_page_height)
        if fragmentpagesize>0:
            currentpagecount+=1
        return currentpagecount

class FragmentTextDocument(QTextDocument):
    '''document fragments rootclass:
        -firstPageHeader
        -docTitle
        -docPrologText
        -notFirstPageHeader
        -docDetailHeader
        -detailitems items
        -detailSummary
        -docEndText
        -docEndFooter
        -pageFooter'''

    def __init__(self,**kwargs):
        super(FragmentTextDocument,self).__init__()
        self.textdict=kwargs

        self.setUseDesignMetrics(True)
        self.setPageSize(QSizeF(793,1123))
        self.setDocumentMargin(0)

        self.fragmentTextEdit=QTextEdit()
        self.fragmentTextCursor = self.fragmentTextEdit.textCursor()
        self.fragmentTextCursor.movePosition(QTextCursor.Start)

        self.createFormats()
        self.detailText()
        self.setHtml(self.fragmentTextEdit.toHtml())

    def createFormats(self): pass #common formats


    def detailText(self):pass #child class create document


    def textHeight(self):
        return self.size().height()+2



2012/10/6 Ofek <ofek at outlook.com>

> Hey,****
>
> ** **
>
> I am trying to produce a text editor similar to word (paginated) in PySide.
> ****
>
> The way I decided to tackle this is having a QGraphicsScene with
> QGraphicsTextItem for each page, and to code the focus by interaction.****
>
> Now all I am trying to do now is have a box representing an A4 page, and
> handling textchanged events using the
> QGraphicsTextItem.document().pageCount() function.****
>
> I bumped into several issues:****
>
>    1. How can I properly define the size of the page given the QSizeF is
>    not using any units? Will defining this right guarantee a true return value
>    from pageCount()?****
>    2. If I define a pageSize at all, QGraphicsTextItem stops expanding.
>    How can I set a fixed size so It'll look like a page?****
>
> ** **
>
> Documentation for Qt is extremely light and I could not figure anything
> out of it.****
>
> ** **
>
> Thanks!****
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20121006/09b56470/attachment.html>


More information about the PySide mailing list