2011-10-02 2 views
3

paintEvent(QPaintEvent * event)을 사용하여 몇 줄을 그립니다. 언젠가 나중에 새 선을 그려야한다면 이전에 그려진 선은 지워지거나 제거되지 않습니다. 이전 줄을 지우거나 지워서 어떻게 새 줄만 그릴 수 있습니까? 이전에 그려진 선을 지우는 물건이 있습니까? 제게 알려주세요.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()에 표시합니다. –

+0

'void QGraphWidget :: paintEvent (QPaintEvent * event) { const QRect & rect = event-> rect(); \t QPainter 페인터 (this); 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

나는 텍스트 줄을 삭제하는 것에 대해 이야기하고 있지 않다. 나는 위젯에서 (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 방법에 맞는 코드 샘플을 참조하십시오. 위젯에 다른 것을 그릴 경우 선을 부정적으로 그리면 일부 그래픽이 지워질 수 있으므로 첫 번째 방법 인 모든 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); 
관련 문제