2014-07-24 3 views
1

qwidget에서 일부 마름모를 그려 이미지로 자동 저장하려고합니다. paintEvent에서 다음 코드를 사용하고 "QWidget :: repaint : Recursive repaint detected"오류가 발생합니다. 문제는 render()가 paintEvent()를 다시 호출하는 것처럼 보입니다. 항상 무한 반복적 인 paintEvent 호출에 갇히게됩니다. 그리기 후에 자동으로 qwidget을 저장할 수있는 방법이 있습니까? 모든 조언은 감사 할 것입니다.자동으로 qwidget를 이미지로 저장하는 방법

void Dialog::paintEvent(QPaintEvent *e) { 
    QPainter painter(this); 
    QRect background(0,0,this->geometry().width(),this->geometry().height()); 
    painter.setBrush(QBrush(Qt::white)); 
    painter.setPen(Qt::NoPen); 
    //QBrush bbrush(Qt::black,Qt::SolidPattern); 
    painter.drawRect(background); 
    int width = this->geometry().width(); 
    int height = this->geometry().height(); 


     int rec_size=64; 
     int rows=floor((double)height/(double)rec_size); 
     int cols=floor((double)width/(double)rec_size); 

     QPointF points[4]; 

     for (int i=0;i<floor(rows);i++){ 
      for (int j=0;j<floor(cols);j++){ 
       painter.setBrush(QBrush(colors[rand() % color_size])); 

       points[0] = QPointF(rec_size*(j),rec_size*(i+0.5)); 
       points[1] = QPointF(rec_size*(j+0.5),rec_size*(i)); 
       points[2] = QPointF(rec_size*(j+1),rec_size*(i+0.5)); 
       points[3] = QPointF(rec_size*(j+0.5),rec_size*(i+1)); 

       painter.drawPolygon(points, 4); 

      } 
     } 
     QPixmap pixmap(this->size()); 
     this->render(&pixmap); 
     pixmap.save("test.png"); 

    } 

답변

2

위젯에는 부울 변수를 멤버로 가질 수 있습니다. 그것은 렌더링 함수를 호출하는지 여부를 제어합니다. 따라서 무한 재귀를 피할 수 있습니다.

m_callRender은 멤버 변수입니다. paintEventrender 함수의 결과로 호출되면 render이 다시 호출되지 않습니다.

paintevent 
{ 
    ... // drawing part 

    if (m_callRender) { 
     m_callRender = false; 
     QPixmap pixmap(this->size()); 
     this->render(&pixmap); 
     pixmap.save("test.png"); 
     m_callRender = true; 
    } 
} 
+0

감사합니다. @ Ashot – newww0

+0

@ newww0 시도를 통해 코드를 업데이트 할 수 있습니까? –

+0

@ Ashot @ Dmitry Sazonov 새 코드로 시도했지만 여전히 QWidget :: repaint : Recursive repaint detected를 얻었습니다. 그러나 이번에는 오류가 아닌 경고로 보입니다. 매번 창 크기를 변경하면 위젯이 다시 그려지고 경고가 튀어 나옵니다. – newww0

0

painttevent() 외부에서 render()를 호출하면 렌더러가 위젯을 다시 그리기하고 pixmap에 저장합니까?

페인트 이벤트 자체를 캐치해야한다면 QObject :: installEventFilter() 또는 QObject :: event() 루틴을 사용하십시오.

관련 문제