Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中重新绘制新线之前,如何删除/清除以前绘制的线?_Qt - Fatal编程技术网

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

在Qt中重新绘制新线之前,如何删除/清除以前绘制的线?,qt,Qt,我用paintEvent(QPaintEvent*event)画了几行。稍后,如果要绘制新线,则不会清除/删除先前绘制的线。如何仅通过删除/清除旧线条来绘制新线条。是否有任何属性可以清除先前绘制的线。请让我知道 void QGraphWidget::paintEvent(QPaintEvent * event) { const QRect & rect = event->rect(); QPainter painter(this); painter.setR

我用
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
}

谢谢…

这是从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;

我不认为有一个特定的电话删除该行。如果每次调用
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++;

但“前几行”被完全清除了。如果你想保留这些,你必须只重新绘制一个特定的区域,或者你必须重新绘制这些区域。

你想在重画之前用窗口背景色填充你的小部件。创建小部件后设置为true,Qt将为您处理此问题。我认为,正确的方法是在绘制新线之前清除该区域。这可以通过使用Stephen Chu建议的autoFillBackground属性来实现,也可以通过在
QGraphWidget::paintEvent
方法中绘制线条之前手动调用

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
的调用中“消极地”绘制线条。如果存储旧直线的坐标,可以先使用背景笔刷绘制直线,然后使用前景笔刷绘制新线。请参阅可能适合您的
drawines
方法的代码示例。请注意,如果在小部件中绘制其他图形,则负面绘制线条可能会删除一些其他图形,这就是为什么第一种方法(删除所有
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);

在paintEvent()中显示代码。
void QGraphWidget::paintEvent(QPaintEvent*event){const QRect&rect=event->rect();QPainter painter(this);painter.setRenderHint(QPainter::antialasing);drawLines(painter,rect);//调用painter.drawLine()}
drawLines在做什么?您是只重新绘制请求的区域还是整个区域?我看到您正在处理事件中的rect()。更新行时如何触发重新绘制?我不是说删除文本行。我说的是在我的小部件上画的(x1,y1,x2,y2)线。我正在使用QPaintEvent执行此操作。尝试了不同的选项,但无法使用新行更新图形。以前的生产线仍然有新的生产线。关于这个问题的任何其他建议…如果您不显示更多代码,我没有其他建议。