Как отобразить содержимое 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();
}
}