2015-03-27 3 views
2

Legacy QGLWidget может быть интегрирован с библиотеками рендеринга (например, SFML) путем передачи winId() результата в библиотеку рендеринга. Но я не могу так работать QOpenGLWidget. Сделав его MainWindow в центральном виджетах, я получаю ряд предупреждений, таких как QOpenGLWidget cannot be used as a native child widget. Consider setting Qt::AA_DontCreateNativeWidgetAncestors and Siblings.. Кроме того, в документации говорится: «QGLWidget, с другой стороны, использует собственное окно и поверхность. (...) QOpenGLWidget избегает этого, не создавая отдельное собственное окно.». Может ли QOpenGLWidget быть интегрирован с сторонним программным обеспечением OpenGL вообще, или он не поддерживается сейчас?Может ли QOpenGLWidget быть интегрирован с сторонней библиотекой OpenGL?

ответ

3

Вам нужно создать QWindow, инициализировать его и интегрировать в приложение с QWidget::createWindowContainer

class MyNativeWindow : QWindow 
{ 
    MyNativeWindow() : QWindow 
    { 
    setSurfaceType(QWindow::OpenGLSurface); 
    } 
}; 

MyNativeWindow *nativeW = new MyNativeWindow(); 
QWidget *w = QWidget::createWindowContainer(nativeW); 
// Use w as a simple QWidget 

В некоторых случаях вам не нужно использовать, чтобы получить winIdHWND. Достаточно знать идентификатор контекста OpenGL. Для пользовательской манипуляции с контекстом gl вы можете использовать класс QOpenGLContext.

Будьте осторожны, потому что, если ваши сторонние библиотеки сами создадут собственные окна (в OS X), у вас будет много ошибок с Qt. Мы привязаны для исправления ошибок в нашем проекте. (Неблокируемые доки, потеря клавиатуры, невозможность открытия меню, ошибки в полноэкранном режиме и т. Д.)

Вы можете посмотреть на это code sample. И пользовательский контекст code sample.

+0

Вторая ссылка (образец пользовательского контекстного кода) больше не работает. –

+0

Спасибо за образец кода, это приведет меня к правильному пути. В моем случае есть постоянное переключение между двумя сторонними зрителями. Один из них основан на QOpenGLWidget, в то время как другой просто берет 'winId()' виджета, чтобы сделать свою магию. Мне потребовался почти день проб и ошибок, чтобы выяснить способ переключения между ними и использования их функций. Я поместил объект MyNativeWindow в контейнер окна, как описано, и, кроме того, чтобы использовать «winId()» окна для стороннего зрителя, мне пришлось «show()» и «hide»() «родительский виджет» ('w 'в вашем случае) соответственно. –

+1

@FranzB. он был удален во время рефакторинга. Можно получить фиксацию на 28 марта для источника. –

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