首页 > 解决方案 > 如何让 resizeEvent-已经执行?

问题描述

我有一个 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

但不幸的是,在调用 init 方法之后调用了 resizeEvent()

例如,当前执行顺序如下。

my_dialog_open_function() {
      m_Dialog->show();
      m_Dialog->init(init_paramter);
}
void OpenGLWindow::resizeEvent(QResizeEvent * event)

由于 resizeEvent 处理程序未初始化 OpenGL 系统,因此我的m_Dialog->init 调用崩溃

我怎样才能得到这个执行流程?

m_Dialog->show();
void OpenGLWindow::resizeEvent(QResizeEvent * event)
m_Dialog->init(init_paramter);

我可以在哪里安全地调用我的 init 函数?

标签: c++qtqdialog

解决方案


正如@pptaszni 在他的评论中提到的,initOpenGL()它看起来不需要大小信息。所以首先我会重新考虑设计。

至于问题:
resize 事件安排在演出之后,并在处理 GUI 事件时交付。那是在你的函数返回之后。

您可以通过发布一些事件来简单地延迟呼叫,然后将在调整大小事件之后传递。最简单的方法是使用单次计时器:

m_Dialog->show();

// Call me in 1ms
QTimer::singleShot(1, [=]() {
   m_Dialog->init(init_paramter);
});

注意1ms的延迟。如果你用 0 调用它,Qt 将优化并立即调用处理程序,所以没有任何收获。


推荐阅读