如何使用颜色将QPlainTextEdit内容渲染到QPixmap

How to render QPlainTextEdit content to QPixmap with colors?

本文关键字:QPixmap 何使用 颜色 QPlainTextEdit      更新时间:2023-10-16

我成功地使用以下代码将QTextEdit的内容呈现为QPixmap。但这对于QPlainTextEdit来说是失败的。当我使用QPlainTextEdit而不是QTextEdit时,它呈现的内容没有任何颜色(全部为黑/白)。

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

如何用颜色渲染QPlainTextEdit的内容?请注意,

  • 如果我们在QPlainTextEdit中将文本设置为html,那么它将生成彩色输出
  • 我正在使用QSyntaxHighlighter::setFormat函数来设置文本颜色

我正在使用Qt4.8.5,VS2008,Windows7

经过调查,我找到了解决方案。

基本上,QPlainTextEdit小部件只绘制可见内容的一部分。因此,我们不能使用QWidget->render来获得渲染的整个内容。但我们可以通过QPlainTextEdit的paintEvent函数的修改版本来实现这一点:

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