Qt用于绘制数据:截取窗口的屏幕截图,然后关闭窗口

时间:2018-08-09 09:14:54

标签: qt

我有一个Qt程序,可以将我的数据可视化为体素网格(请参见下图)。但是我只想运行一次Qt程序,以便显示数据,截屏然后退出整个程序。

这是我的代码:

https

在上面的示例中,int main(int argc, char** argv) { QApplication app(argc, argv); Mainframe frame(voxelGrid); frame.show(); app.exec(); frame.saveScreenshot(); return 0; } 是继承自Mainframe的类。

但是似乎我需要调用QMainWindow,否则app.exec函数将仅存储黑色图像。 saveScreenshot但是会​​导致无限循环,在程序继续保存屏幕截图之前,我需要手动关闭窗口。知道如何解决这个问题吗?

这是我要绘制的数据: enter image description here

使用Qt的屏幕截图功能:

app.exec

其中 QImage img = ui.mViewport->grabFrameBuffer(); img.save("screenshot.png"); QApplication::clipboard()->setImage(img); 是从mViewport继承的类。
整个Qt-Window如下所示: enter image description here

2 个答案:

答案 0 :(得分:0)

我以Qt grabber为例获取屏幕截图:

#include "glwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    GLWidget w;
    w.renderPixmap(w.width(), w.height()).save("screenshot.png");

    return 0;
}

enter image description here

只需使用QGLWidget :: renderPixmap渲染框架。

  

该函数在内部渲染到一个帧缓冲对象中并执行   像素回读。

答案 1 :(得分:0)

所以解决方案如下:

int main(int argc, char** argv) {
  QApplication app(argc, argv);
  Mainframe frame(voxelGrid);
  frame.show();

  Viewport* widget;
  widget = frame.ui.mViewport;
  widget->show();

  QApplication::processEvents();
  QApplication::processEvents();

  widget->updateGL();
  frame.saveScreenshot();

  return 0;
}

因此,显然我必须获得指向mViewport(QGLWidget)的指针,然后调用 QApplication::processEvents(); 2次(!)(由于任何原因一次都不够)。最终,对mViewport widget->updateGL();进行了自定义的绘制方法,然后frame.saveScreenshot();开始起作用。

不确定我的问题是否归因于Qt或mViewport对象的细节。在后一种情况下,我的问题可能对他人无济于事。抱歉;)