2016-07-20 9 views
-1

Ich versuche, einen Bildschirmgrabber mit qt und QOpenGLFunctions zu machen. Mein Code seg Fehler auf funcs = context-> functions(); Dieser Code ist nicht wirklich so toll oder threaded und die Timer sind nicht präzise in solch kleinen Intervallen, aber es ist eher ein Beweis des Konzepts als Code, den ich verwenden möchte. Wie ich es verstehe, muss ich diese QOpenGLFunctions verwenden, um ANGLE für Windows verwenden zu können. Das würde helfen, weil Windows nur mit opengl 1.0 ausgeliefert wird und ich würde das lieber nicht benutzen und stattdessen directx durch ANGLE benutzen. Ich habe auf Ubuntu 16.04 LTS und Windows 10 mit QT 5.5.1 bis 5.7 auf allen Kits getestet.Qt OpenGLFunctions seg Fehler

Constructor:

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); 
} 

}

Mein anderes Problem mit diesem Code ist, dass die nicht qt glReadPixels aus irgendeinem Grund nicht schreiben zu der qimage.bits().

+1

funktioniert 'context-> create();' true oder false? – PeterT

+0

'Meine Code-Seg-Fehler' OK, also war das nächste, was Sie getan haben, Ihren Debugger zu öffnen, den Absturz aufzurufen und einen Stack-Trace im Debug-Modus auszuführen. Was hat es dir gezeigt? –

+0

context.create() gibt false zurück. Das könnte also das Problem sein. Der Seg-Fehler tritt auf und gibt nur den Speicherort des kompilierten Codes in der Befehlswarteschlange an. Sagt nur die Adresse der Anweisung, die es verursacht hat. –

Antwort

0

Sie sollten wahrscheinlich Ihren Kontext aktuell machen oder QOpenGLContext::currentContext verwenden. Außerdem sollten Sie überprüfen, ob Ihre App tatsächlich OpenGL verwendet.

Wenn Sie OpenGL nicht unbedingt benötigen und nur ein Bild von einem QWidget wie QMainWindow anzeigen möchten, können Sie sich die Datei QWidget::render ansehen.

+0

Ich habe Kontext den aktuellen Kontext gemacht und ich habe es in OpenGL 4.5 geändert, nur um es zu versuchen. Ich verwende OpenGL nicht in meiner App. Ich verwende es wirklich nur, um den Bildschirm zu erfassen, weil die Methode [Screenshot Example] (http://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-example.html) zu langsam ist. –

+0

glReadPixels liest Pixel innerhalb des dem gl-Kontext zugeordneten Fensters. Wenn Ihre Anwendung OpenGL nicht verwendet, werden diese Pixel nicht zurückgegeben. Und wenn Sie den gesamten Bildschirm möchten, müssen Sie das Betriebssystem oder X11 tatsächlich fragen. Es gibt viele Fragen zu SO zu Linux: http://stackoverflow.com/questions/2607010/linux-how-to-capture-screen-and-simulate-mouse-movements. –

Verwandte Themen