C++ GTKmm Opengl上下文未初始化

C++ GTKmm Opengl上下文未初始化,c++,opengl,gtkmm,mpv,C++,Opengl,Gtkmm,Mpv,我试图在GTKmm中创建一个视频播放器,为此我正在使用。文档中说,我可以使用OpenGL视图嵌入视频播放器。但是,我在GTKmm应用程序中实现播放器时遇到困难 我有一个GLWindow,它包含一个眩光,然后应该包含视频播放器。问题是,当我尝试初始化mpv渲染上下文时,我得到一个错误,告诉我OpenGL没有初始化 以下是我拥有的主窗口的构造函数: GLWindow::GLWindow():眩光{} { 设置标题(“GL区域”); 设置默认大小(400600); 设置语言环境(LC_数字,“C”);

我试图在GTKmm中创建一个视频播放器,为此我正在使用。文档中说,我可以使用OpenGL视图嵌入视频播放器。但是,我在GTKmm应用程序中实现播放器时遇到困难

我有一个GLWindow,它包含一个眩光,然后应该包含视频播放器。问题是,当我尝试初始化mpv渲染上下文时,我得到一个错误,告诉我OpenGL没有初始化

以下是我拥有的主窗口的构造函数:

GLWindow::GLWindow():眩光{}
{
设置标题(“GL区域”);
设置默认大小(400600);
设置语言环境(LC_数字,“C”);
VBox_u.property_margin()=12;
VBox_u.设置_u间距(6);
添加(VBox);
眩光设置(真);
眩光设置视场(真);
眩光设置自动渲染(真);
眩光设置所需版本(4,0);
VBox_uu1.add(眩光a_u2);
mpv=mpv_create();
如果(!mpv)
抛出std::runtime_错误(“无法创建mpv上下文”);
mpv_设置_选项_字符串(mpv,“终端”,“是”);
mpv_set_option_字符串(mpv,“msg level”,“all=v”);
如果(mpv_初始化(mpv)<0)
抛出std::runtime_错误(“无法初始化mpv上下文”);
mpv_render_param params[]={
{MPV_RENDER_PARAM_API_TYPE,const_cast(MPV_RENDER_API_TYPE_OPENGL)},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS,static_cast(新)(MPV_OPENGL_INIT_PARAMS){
.get_proc_address=get_proc_address,
})},
{MPV_RENDER_PARAM_INVALID}
};
if(mpv_render_context_create(&mpv_gl,mpv,params)<0)
抛出std::runtime_错误(“未能创建渲染上下文”);
mpv_呈现_上下文_设置_更新_回调(mpv_gl,GLWindow::onUpdate,this);
}
据我所知,这应该只是初始化视频播放器视图,但当我尝试使用
mpv\u render\u context\u create
创建渲染上下文时,问题就出现了。我在该行中得到以下错误:

[libmpv_render]glGetString(GL_版本)返回空值。
[libmpv_render]OpenGL未初始化

然后,应用程序以
SIGSEGV
信号终止

问题可能来自我的
get\u proc\u address
函数,目前我只在linux上实现了它,如下所示:

静态void*get\u proc\u地址(void*ctx,const char*name){
返回(void*)glXGetProcAddress(重新解释铸造(名称));
}

老实说,我对为什么不创建OpenGL上下文感到不知所措。如何调整GTKmm应用程序以允许mpv视频播放器正确初始化?

正如错误所示,问题在于没有OpenGL上下文。GLArea不会立即创建,当OpenGL视图创建完成后,GLArea上会出现一个事件
signal\u realize
。我必须听那个事件,在那里设置
GLArea.make_current()
后初始化mpv变量,以将GLArea的上下文设置为我们想要连接到mpv的上下文