Как отобразить содержимое QPlainTextEdit в QPixmap с цветами?

Я успешно использовал следующий код для рендеринга содержимого 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 с цветами? Пожалуйста, обратите внимание,

  • Если мы устанавливаем текст как html в QPlainTextEdit, то он генерирует цветной вывод.
  • я использую QSyntaxHighlighter::setFormat Функция для установки цвета текста.

Я использую Qt4.8.5, VS2008, Windows7

1 ответ

Решение

После расследования я нашел решение.

в основном, виджет QPlainTextEdit рисует только ту часть контента, которая видна. Следовательно, мы не можем использовать QWidget->render для получения всего содержимого. Но мы можем сделать это с помощью модифицированной версии функции paintEvent в QPlainTextEdit:

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();
    }
}
Другие вопросы по тегам