Search code examples
c++qtqtexteditqt4.8qplaintextedit

How to render QPlainTextEdit content to QPixmap with colors?


I was successfully using following code to render the content of a QTextEdit to QPixmap. But this fails for QPlainTextEdit. When I use QPlainTextEdit instead of QTextEdit, it rendered the content without any colors (all in black/white).

QPixmap* pixmap = new QPixmap(width, height);

QPainter* painter = new QPainter(pixmap);
painter->fillRect( 0, 0, width, height, QColor(247, 247, 247) );
painter->setRenderHints(QPainter::SmoothPixmapTransform |
                        QPainter::HighQualityAntialiasing |
                        QPainter::TextAntialiasing);

m_pTextEdit->document()->drawContents(painter);

How can we render the content of a QPlainTextEdit with colors? Please note,

  • If we set text as html in the QPlainTextEdit then it generates colored output.
  • I'm using QSyntaxHighlighter::setFormat function to set the text colors.

I'm using Qt4.8.5, VS2008, Windows7


Solution

  • after investigation, I have found a solution.

    basically, the QPlainTextEdit widget only draws the part of the content that is visible. Therefore, we can't use QWidget->render to get the entire content rendered. But we can do this by a modified version of the QPlainTextEdit's paintEvent Function:

    void TextEditor::getScreenshot(QPixmap &map)
    {
        QPainter painter(&map);
    
        int offset = 0;
        block = document()->firstBlock();
    
        while (block.isValid())
        {
            QRectF r = blockBoundingRect(block);
            QTextLayout *layout = block.layout();
    
            if (!block.isVisible())
            {
                offset += r.height();
                block = block.next();
                continue;
            }
            else
            {
                layout->draw(&painter, QPoint(0,offset));
            }
    
            offset += r.height();
    
            block = block.next();
        }
    }