[Interest] QTextEdit line number paint event
Sensei
senseiwa at gmail.com
Tue Jun 4 17:06:00 CEST 2013
Dear all,
I modified the QPlainTextEdit example that draws line numbers to suit my
taste. What I'd want is simple: display the line number in red if it's
the current line, gray otherwise.
It turns out, the paint event seems to be not in sync with the current
status, leaving unmarked lines or having double red lines, as if it
didn't re-paint them. All I added is a naive if, as you can see below.
Any hints?
// Draw the line numbers widget
void Editor::lineNumberAreaPaintEvent(QPaintEvent *event)
{
// Create the main painter
QPainter painter(lines_);
// Create the rectangle
painter.fillRect(event->rect(), QColor(241, 241, 241));
// Get the visible blocks of text
QTextBlock block = firstVisibleBlock();
int blockNumber = block.blockNumber();
int top = (int)
blockBoundingGeometry(block).translated(contentOffset()).top();
int bottom = top + (int) blockBoundingRect(block).height();
// Loop for all visible blocks
while (block.isValid() && top <= event->rect().bottom())
{
// If we can paint it
if (block.isVisible() && bottom >= event->rect().top())
{
// Line number
QString number = QString::number(blockNumber + 1);
// Set the style
if (blockNumber != textCursor().blockNumber())
painter.setPen(Qt::gray);
else
painter.setPen(Qt::red);
// Draw the text
painter.drawText(0, top, lines_->width(),
fontMetrics().height(), Qt::AlignRight, number);
}
// Go to next block of text
block = block.next();
top = bottom;
bottom = top + (int) blockBoundingRect(block).height();
++blockNumber;
}
}
More information about the Interest
mailing list