我想在qwidget中绘制一些菱形并自动将其保存为图像。我在paintEvent中使用以下代码并得到此错误" QWidget :: repaint:检测到递归重绘"。问题是render()似乎再次调用paintEvent(),我总是陷入无限的递归paintEvent调用。有没有办法在绘图后自动保存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");
}
答案 0 :(得分:2)
您可以将布尔变量作为窗口小部件中的成员。它将控制是否调用渲染函数。所以你可以避免无限递归。
m_callRender
是成员变量。如果paintEvent
函数调用了render
,则render
将不会再次调用。
paintevent
{
... // drawing part
if (m_callRender) {
m_callRender = false;
QPixmap pixmap(this->size());
this->render(&pixmap);
pixmap.save("test.png");
m_callRender = true;
}
}
答案 1 :(得分:0)
在paintevent()之外调用render(),render会重新绘制widget并将其保存到pixmap或者我错过了什么?
如果你需要自己捕获绘图事件,那么使用QObject :: installEventFilter()或QObject :: event()例程。