我使用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
}
...谢谢
答案 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;