2013-06-17 11 views
6

Ho bisogno di afferrare ogni disegno QML (QtQuick 2) e inviato sulla rete. Al momento ho usato il metodo elencato di seguito, ma questo metodo ha due grande svantaggioCattura il buffer di disegno QML, senza visualizzare

1) A causa di funzione QT5 documentazione grabWindow() ha problemi di prestazioni

2) Non può funzionare con finestra nascosta QML

E 'possibile ottenere il buffer di rendering OpenGL subito dopo QQuickWindow :: afterRendering? Utilizzo degli FBO? Contesto opengl condiviso?

class Grab: public QObject 
{ 
public: 
Grab(QQuickWindow * wnd) : wnd_(wnd) {} 

public slots: 

    void Grabme() 
    { 
     QImage image = wnd_->grabWindow(); 
    } 

private: 

QQuickWindow *wnd_; 
}; 

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


QtQuick2ApplicationViewer viewer; 
viewer.setMainQmlFile(QStringLiteral("qml/grab1/main.qml")); 
viewer.showExpanded(); 

Grab grab(&viewer); 
QObject::connect(&viewer, &QtQuick2ApplicationViewer::frameSwapped, 
        &grab, &Grab::Grabme, Qt::DirectConnection); 


return app.exec(); 
} 

risposta

8

Esempio muggito può afferrare qualsiasi contenuto qml su FBO e quindi inviarlo come Immagine via segnale. Solo un problema di questo approccio è la visibilità, la finestra di cattura deve essere visibile per l'acquisizione riuscita. Se qualcuno sa come prevenirlo, puoi aiutarmi e fornire un approccio più avanzato.

+0

questo codice mi dà errore: errore C2027: uso di tipo non definito 'QOpenGLFramebufferObject' 1> C: \ Qt \ Qt5.1.0 \ 5.1.0 \ msvc2010 \ include \ QtQuick/qquickwindow.h (57): vedere la dichiarazione di 'QOpenGLFramebufferObject' 1> grab_window.cpp (16): errore C2232: '-> QScopedPointer :: isNull': l'operando sinistro ha 'classe', usa '. – otto

+0

Dovresti controllare se la tua versione Qt è stata compilata con il supporto OpenGL, se lo scarichi dal sito ufficiale, che dovrebbe essere. Inoltre, per quanto riguarda msvc2010 è necessario creare un file di progetto corretto con la libreria inclusa. Sto usando entrambi i file di progetto cmake e .pro e tutto funziona su Qt 5.0.2 – Dmitry

+0

sì, questo è il motivo, sto sviluppando su Windows 7 da Visual Studio 2010, ho usato la macro QT_NO_OPENGL, altrimenti non è possibile trovare le intestazioni GLES2 . – otto

2

Sono riuscito a trovare un trucco per far funzionare grabWindow() quando la finestra non è "visibile". Il trucco è impostare visibility: Window.Minimized della finestra e flags: Qt.Tool. La finestra non viene visualizzata all'utente, ma agli interni di Qt sembra visibile e la chiamata al metodo grabWindow() funziona come previsto. Ricorda di chiamare quel metodo solo dopo aver inizializzato la scena.

L'unico problema con questa soluzione (che ho trovato) è che se la proprietà color della finestra è impostata su transparent, il contenuto acquisito ha uno sfondo nero.

Problemi correlati