如何将qwidget自动保存为图像

how to save qwidget as image automatically

本文关键字:保存 图像 qwidget      更新时间:2023-10-16

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

您可以将布尔变量作为小部件中的成员。它将控制是否调用渲染函数。所以你可以避免无限递归。

m_callRender是成员变量。如果render函数导致paintEvent被调用,render将不再被调用。

paintevent 
{
    ... // drawing part
    if (m_callRender) {
        m_callRender = false;
        QPixmap pixmap(this->size());
        this->render(&pixmap);
        pixmap.save("test.png");
        m_callRender = true;
    }
}

在painteevent()之外调用render(),渲染将重新绘制小部件并将其保存为pixmap还是我错过了什么?

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