如何自动保存QWidget为图像

3

我想在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");

     }
2个回答

3

您可以在widget中作为成员变量定义布尔类型的变量。它将控制是否调用render函数,从而避免无限递归。

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

@newww0,你能更新一下你的代码吗?谢谢。 - Dmitry Sazonov
@Ashot@Dmitry Sazonov 我尝试了新的代码,但仍然出现“QWidget::repaint: Recursive repaint detected”的错误。但这次它似乎是一个警告而不是错误。每次我改变窗口大小时,小部件都会被重新绘制并弹出警告。 - newww0

0

在paintevent()之外调用render(),render将重新绘制小部件并将其保存到pixmap中,或者我漏掉了什么?

如果您需要捕获paint事件本身,则使用QObject::installEventFilter()或QObject::event()例程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接