如何让resizeEvent-already-executed?
How to get resizeEvent-already-executed?
我有一个 QDialog-inherited class 并且 它的一个子 window 是在 resizeEvent 上初始化的,就像这样。
void OpenGLWindow::resizeEvent(QResizeEvent *event) {
QWindow::resizeEvent(event);
// initialize on first call
if (m_context == nullptr)
initOpenGL();
resizeGL(width(), height());
}
因为OpenGL初始化需要宽高信息,需要适应window大小的变化,这个初始化代码不能移到其他地方。
我应该打开这个对话框并初始化一些 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)
由于 OpenGL 系统未通过 resizeEvent 处理程序初始化,我的 m_Dialog->init 调用崩溃。
如何获得这个执行流程?
m_Dialog->show();
void OpenGLWindow::resizeEvent(QResizeEvent * event)
m_Dialog->init(init_paramter);
我可以安全调用 init 函数的正确位置在哪里?
正如@pptaszni 在他的评论中提到的,initOpenGL()
看起来不需要尺寸信息。所以首先我会重新考虑设计。
关于问题:
调整大小事件安排在显示之后,并在处理 GUI 事件时交付。那是在你的函数 returns.
之后
您可以通过发布一些事件来简单地延迟调用,然后将在调整大小事件之后传递。最简单的方法是使用单发定时器:
m_Dialog->show();
// Call me in 1ms
QTimer::singleShot(1, [=]() {
m_Dialog->init(init_paramter);
});
注意1毫秒的延迟。如果你用 0 调用它,Qt 将优化并立即调用处理程序,所以那里没有好处。
我有一个 QDialog-inherited class 并且 它的一个子 window 是在 resizeEvent 上初始化的,就像这样。
void OpenGLWindow::resizeEvent(QResizeEvent *event) {
QWindow::resizeEvent(event);
// initialize on first call
if (m_context == nullptr)
initOpenGL();
resizeGL(width(), height());
}
因为OpenGL初始化需要宽高信息,需要适应window大小的变化,这个初始化代码不能移到其他地方。
我应该打开这个对话框并初始化一些 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)
由于 OpenGL 系统未通过 resizeEvent 处理程序初始化,我的 m_Dialog->init 调用崩溃。
如何获得这个执行流程?
m_Dialog->show();
void OpenGLWindow::resizeEvent(QResizeEvent * event)
m_Dialog->init(init_paramter);
我可以安全调用 init 函数的正确位置在哪里?
正如@pptaszni 在他的评论中提到的,initOpenGL()
看起来不需要尺寸信息。所以首先我会重新考虑设计。
关于问题:
调整大小事件安排在显示之后,并在处理 GUI 事件时交付。那是在你的函数 returns.
您可以通过发布一些事件来简单地延迟调用,然后将在调整大小事件之后传递。最简单的方法是使用单发定时器:
m_Dialog->show();
// Call me in 1ms
QTimer::singleShot(1, [=]() {
m_Dialog->init(init_paramter);
});
注意1毫秒的延迟。如果你用 0 调用它,Qt 将优化并立即调用处理程序,所以那里没有好处。