Ответ 1
Документ Qt-interest Archive, август 2008 г. QGLContext:: create()
говорит:
QGLContext может быть создан только с помощью действительного устройства GL-краски, которое означает, что он должен быть привязан к QGLWidget, QGLPixelBuffer или QPixmap при его создании. Если вы используете QPixmap, это даст вам только для программного обеспечения, и вы этого не хотите. Объект QGLFramebufferObject само по себе не является действительным устройством окраски GL, оно может быть создано только внутри контекст QGLWidget или QGLPixelBuffer. Это означает, что вам нужен QGLWidget или QGLPixelBuffer в качестве базы для вашего QGLFramebufferObject.
Как указано в документе, если вы хотите отображать в буфер вне экрана с помощью opengl, вам нужен QGLPixelBuffer. Код ниже - очень простой пример, демонстрирующий, как использовать QGLPixelBuffer с OpenGL:
#include <QtGui/QApplication>
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <QtOpenGL/QGLFormat>
#include <QtOpenGL/QGLPixelBuffer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Construct an OpenGL pixel buffer.
QGLPixelBuffer glPixBuf(100, 100);
// Make the QGLContext object bound to pixel buffer the current context
glPixBuf.makeCurrent();
// The opengl commands
glClearColor(1.0, 1.0, 1.0, 0.0);
glViewport(0, 0, 100, 100);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 100, 0, 100);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glPointSize(4.0);
glBegin(GL_TRIANGLES);
glVertex2i(10, 10);
glVertex2i(50, 50);
glVertex2i(25, 75);
glEnd();
// At last, the pixel buffer was saved as an image
QImage &pImage = glPixBuf.toImage();
pImage.save(QString::fromLocal8Bit("gl.png"));
return a.exec();
}
Результатом программы является файл изображения png как:
Для версии non-opengl с использованием QPixmap код может быть в следующих формах:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPixmap pixmap(100, 100);
QPainter painter;
painter.begin(&pixmap);
painter.drawText(10, 45, QString::fromLocal8Bit("I love American."));
painter.end();
pixmap.save(QString::fromLocal8Bit("pixmap.png"));
return a.exec();
}
Результатом программы выше является файл png, который выглядит следующим образом:
Хотя код прост, но он работает, возможно, вы можете сделать некоторые изменения, чтобы сделать его подходящим для вас.