如何在重新绘制Qt中的新行之前删除/清除以前绘制的行?

时间:2011-10-02 09:25:48

标签: qt

我使用paintEvent(QPaintEvent * event)画了几行。稍后如果我想绘制新线条,则不会清除/删除先前绘制的线条。我怎样才能通过删除/清除旧行来绘制新行。是否有任何财产可以清除以前绘制的线条。请告诉我。

void QGraphWidget::paintEvent(QPaintEvent * event)
{
    const QRect & rect = event->rect();
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    drawLines(painter, rect);//calling painter.drawLine() inside
}

...谢谢

4 个答案:

答案 0 :(得分:4)

您希望在重绘之前使用窗口背景颜色填充窗口小部件。创建窗口小部件后将autoFillBackground设置为true,Qt将为您处理

答案 1 :(得分:4)

在我看来,正确的方法是在绘制新线之前清除该区域。这可以通过使用Stephen Chu建议的autoFillBackground属性,或者在QGraphWidget::paintEvent方法中绘制线条之前手动调用QPainter::eraseRect()来实现。

void QGraphWidget::paintEvent(QPaintEvent * event)
{
    const QRect & rect = event->rect();
    QPainter painter(this);
    painter.eraseRect(rect);
    painter.setRenderHint(QPainter::Antialiasing);
    drawLines(painter, rect);
}

另一个选择是“消极”绘制前一次调用QGraphWidget::paintEvent的行。如果存储旧线的坐标,则可以先使用背景画笔绘制线条,然后使用前景笔刷绘制新线条。请参阅可能适合您drawLines方法的代码示例。请注意,如果您在窗口小部件中绘制其他内容,则负面绘制线条可能会删除其他一些图形,这就是为什么第一种方法(删除所有GraphWidget区域)更好。

// save the current brush
QBrush currentBrush = painter.brush();
// draw the old line with the background brush
painter.setBrush(background());
painter.drawLine(oldLine);
// draw the new line with the current brush
painter.setBrush(currentBrush);
painter.drawLine(newLine);

答案 2 :(得分:2)

我认为没有特定的要求删除该行。如果每次调用paintEvent()函数时重新绘制整个区域,则不应看到前面的行。如果你没有重新粉刷该区域,你将不得不自己画线。例如,这个代码在每次调用方法时都在不同的位置画一条线:

QPainter painter(this);
painter.setBrush(QBrush(Qt::red));
painter.drawRect(rect());
painter.setPen(QPen(Qt::yellow));
static int i = 0;
painter.drawLine(QPointF(i, i), QPointF(i, height() - i));
i++;

但完全清除“前一行”。如果你想保留那些你只需重新绘制一个特定区域,或者你必须重新绘制它们。

答案 3 :(得分:-3)

这是从QT删除整行的一种方法。

me->setFocus();
int pos;
QTextCursor tc= me->textCursor();
pos=tc.columnNumber();
tc.select(QTextCursor::LineUnderCursor);
QString str=tc.selectedText();
tc.removeSelectedText();

tc.movePosition(QTextCursor::NextBlock,QTextCursor::MoveAnchor);
tc.insertText(str);
tc.insertBlock();
tc.movePosition(QTextCursor::PreviousBlock,QTextCursor::MoveAnchor);
tc.movePosition(QTextCursor::StartOfLine,QTextCursor::MoveAnchor);
me->setTextCursor(tc);
return true;