2016-07-20 3 views
-1

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

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

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

does 'context-> create();' return true или false? – PeterT

+0

'Мой код seg faults' ОК, поэтому, конечно же, следующая вещь, которую вы сделали, это открыть ваш отладчик, вызвать крах и запустить трассировку стека в режиме отладки. Что он вам показал? –

+0

context.create() возвращает false. Так может быть и проблема. Отказ seg возникает, и он просто дает местоположение скомпилированного кода в очереди команд. Просто говорит адрес инструкции, которая вызвала это. –

ответ

0

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

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

+0

Я применил контекст текущего контекста, и я изменил его на openGL 4.5, чтобы попробовать его. Я не использую openGL в своем приложении. Я действительно использую его только для захвата экрана, потому что метод [Скриншот] (http://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-example.html) слишком медленный. –

+0

glReadPixels считывает пиксели внутри окна, связанные с контекстом gl. Если ваше приложение не использует OpenGL, оно не вернет эти пиксели. И если вам нужен весь экран, вам нужно спросить ОС или X11 на самом деле. На SO есть много вопросов о том, что для Linux: http://stackoverflow.com/questions/2607010/linux-how-to-capture-screen-and-simulate-mouse-movements. –

 Смежные вопросы

  • Нет связанных вопросов^_^