Ошибка сегмента Qt OpenGLFunctions

Я пытаюсь сделать скриншот граббер, используя qt и QOpenGLFunctions. Мой код вызывает ошибки на funcs = context-> functions (); Этот код на самом деле не так хорош или многопоточен, и таймеры не точны с такими небольшими интервалами, но это скорее подтверждение концепции, чем код, который я планирую использовать. Как я понимаю, мне нужно использовать эти QOpenGLFunctions, чтобы он мог использовать ANGLE на окнах. Это помогло бы, потому что Windows поставляется только с opengl 1.0, и я бы предпочел не использовать это, а вместо этого использовать directx через ANGLE. Я тестировал Ubuntu 16.04 LTS и Windows 10, используя QT 5.5.1 — 5.7 на всех комплектах.

Конструктор:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//QOpenGLContext *context = new QOpenGLContext();
QOpenGLContext *context = QOpenGLContext::CurrentContext();
//I only want to use glreadpixels. I don't need the rest of opengl. This may not be necessary.
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGL);
format.setDepthBufferSize(32);
format.setVersion(4,5);
format.setSamples(4);
format.setProfile(QSurfaceFormat::CompatibilityProfile);
context->setFormat(format);
context->create();

funcs = context->functions(); //seg faults here
funcs->initializeOpenGLFunctions();
connect(timer, SIGNAL(timeout()), this, SLOT(grabScreen()));
connect(timer2, SIGNAL(timeout()),this, SLOT(quit()));

timer->setTimerType(Qt::PreciseTimer);
timer2->setTimerType(Qt::PreciseTimer);
timer2->start(10000); //10 sec
timer->start(1000/60); //60 fps

}

grabScreen:

void MainWindow::grabScreen()
{
//this method it too slow for anything more than one Monitor at 60 fps.
//this->originalPixmap = this->primary->grabWindow(0,0,0,1920,1080);//this method is fast. Did 120 FPS no problem. It doesn't use the QtOpenGLFunctions. Less portable?
//QImage image(1920,1080,QImage::Format_RGBA8888);
//glReadPixels(0,0,1920,1080,GL_RGBA,GL_UNSIGNED_BYTE, image.bits());//not writing to the image bits

QImage image(1920,1080,QImage::Format_RGBA8888);
funcs->glReadPixels(0,0,1920,1080,GL_RGBA,GL_UNSIGNED_BYTE, image.bits());

frameCount++;
if(frameCount % 10 == 0) //update preview label
{
//ui->label->setPixmap(QPixmap::fromImage(image.scaled(ui->label->size())));
ui->label->setPixmap(originalPixmap.scaled(ui->label->size()));
//qDebug() << QString("Frame: " + frameCount);
}

}

Моя другая проблема с этим кодом заключается в том, что по какой-то причине не qt glreadpixels не записывает в qimage.bits ().

-1

Решение

Вы, вероятно, должны сделать ваш контекст текущим или использовать QOpenGLContext :: currentContext. Также вы должны проверить, что ваше приложение на самом деле использует OpenGL.

Если вам конкретно не нужно использовать OpenGL, и вы просто хотите получить снимок QWidget, такого как QMainWindow, вы можете взглянуть на QWidget :: оказывать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]