【发布时间】:2021-06-21 11:38:42
【问题描述】:
我有一个 QDialog 继承的类,并且 它的一个子窗口在 resizeEvent 上初始化,就像这样。
void OpenGLWindow::resizeEvent(QResizeEvent *event) {
QWindow::resizeEvent(event);
// initialize on first call
if (m_context == nullptr)
initOpenGL();
resizeGL(width(), height());
}
因为OpenGL init需要宽高信息,并且需要适应窗口大小的变化,所以这个init代码不能移动到其他地方。
我应该打开这个对话框并初始化一些 OpenGL 绘图对象。
m_Dialog->show();
m_Dialog->init(init_paramter); //I have to create opengl buffers of draw objects here
但不幸的是,resizeEvent() 是在调用 init 方法之后调用的。
例如当前执行顺序如下。
my_dialog_open_function() {
m_Dialog->show();
m_Dialog->init(init_paramter);
}
void OpenGLWindow::resizeEvent(QResizeEvent * event)
由于 resizeEvent Handler 未初始化 OpenGL 系统,我的 m_Dialog->init 调用崩溃。
我怎样才能得到这个执行流程?
m_Dialog->show();
void OpenGLWindow::resizeEvent(QResizeEvent * event)
m_Dialog->init(init_paramter);
我可以在哪里安全地调用我的 init 函数?
【问题讨论】:
-
从代码看来
initOpenGL();(我假设它为m_context分配了一些东西)不需要宽度和高度。只打电话给resizeGL(width(), height());。除非 init 方法更复杂,并且它对窗口几何有一定的依赖性。 -
啊,谢谢。我会尝试将 (if (m_context == nullptr) initOpenGL();) 移动到全局初始化区域。
-
@pptaszni,我把initOpenGL放在构造函数里,直接崩溃了。似乎应该在创建小部件的任何回调(如 resizeEvent)中调用 initOpenGL。