Мне нужно захватить каждый кадр чертежа QML (QtQuick 2) и отправить его по сети. На данный момент я использовал метод перечисленные ниже, однако этот метод имеет два больших недостаткаЗахват буфера рисования QML, без отображения
1) Благодаря функции Qt5 документации grabWindow() имеет производительность вопросы
2) Он не может работать со скрытым окном QML
Возможно ли получить буфер рендеринга OpenGL сразу после QQuickWindow :: afterRendering? Использование FBOs? Общий контекст opengl?
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();
}
этот код дает мне ошибку: ошибка C2027: использование неопределенного типа 'QOpenGLFramebufferObject' 1> C: \ Qt \ Qt5.1.0 \ 5.1.0 \ msvc2010 \ включать \ QtQuick/qquickwindow.h (57): см. объявление «QOpenGLFramebufferObject» 1> grab_window.cpp (16): ошибка C2232: '-> QScopedPointer :: isNull': левый операнд имеет тип 'class', используйте '. –
otto
Вы должны проверить, скомпилирована ли ваша версия Qt с поддержкой OpenGL, если вы загрузите ее с официального сайта, что она должна быть. Кроме того, в отношении msvc2010 вам необходимо создать правильный файл проекта с включенной библиотекой. Я использую файлы проекта cmake и .pro, и все работает на Qt 5.0.2 – Dmitry
да, это причина, я разрабатываю Windows 7 с помощью Visual Studio 2010, я использовал макрос QT_NO_OPENGL, иначе он не может найти заголовки GLES2 , – otto