2011-10-02 6356 views
3

我正在使用paintEvent(QPaintEvent * event)繪製幾行。稍後如果我想繪製新線,那麼先前繪製的線不會被清除/移除。我怎麼才能畫出新的線,通過刪除/清除舊線。是否有任何財產來清除以前畫出的lines.Please讓我知道。如何在Qt中重新繪製新行之前刪除/清除以前繪製的線條?

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

在paintEvent()中顯示代碼。 (QPaintEvent * event) –

+0

void QGraphWidget :: paintEvent(QPaintEvent * event) { const QRect&rect = event-> rect();\t QPainter畫家(本); painter.setRenderHint(QPainter :: Antialiasing); \t drawLines(painter,rect); //調用painter.drawLine()在 }內 – user435062

+1

drawLines在做什麼?您是否僅重繪要求的區域或整個區域?我看到你正在處理事件中的rect()。 –

回答

-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; 
+1

我不是在說刪除文本行。我正在討論在我的Widget上繪製像(x1,y1,x2,y2)的線條。我正在使用QPaintEvent。 – user435062

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++; 

但是「前面的行」被完全清除。如果你想保留這些,你只需要重新繪製一個特定的區域,否則你將不得不重新繪製這些區域。

+0

嘗試了不同的選項,但未能用新行更新圖形。以前的行仍然有新的行。在這個問題上的任何其他建議... – user435062

+0

如果你不顯示更多的代碼,我沒有其他建議。 –

3

想要在重繪之前用窗口背景顏色填充您的窗口小部件。在創建小部件後,將autoFillBackground設置爲true,Qt將爲您處理此問題。

2

在我看來,正確的做法是在繪製新線條之前清除該區域。這可以通過使用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方法。請注意,如果您在窗口小部件中繪製其他圖形,則消極地繪製線條可能會擦除其他一些圖形,這就是爲什麼第一種方法(即刪除所有區域)更好的原因。

// 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);