如何让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 将优化并立即调用处理程序,所以那里没有好处。