3

我成功地使用以下代码将 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

4

1 回答 1

4

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

基本上,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();
    }
}
于 2015-02-09T07:18:34.737 回答