c++ - 如何让 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 函数?
解决方案
正如@pptaszni 在他的评论中提到的,initOpenGL()
它看起来不需要大小信息。所以首先我会重新考虑设计。
至于问题:
resize 事件安排在演出之后,并在处理 GUI 事件时交付。那是在你的函数返回之后。
您可以通过发布一些事件来简单地延迟呼叫,然后将在调整大小事件之后传递。最简单的方法是使用单次计时器:
m_Dialog->show();
// Call me in 1ms
QTimer::singleShot(1, [=]() {
m_Dialog->init(init_paramter);
});
注意1ms的延迟。如果你用 0 调用它,Qt 将优化并立即调用处理程序,所以没有任何收获。
推荐阅读
- azure-ad-graph-api - 在不使用 Intune 的情况下将 Azure AD 设备标记为合规
- replication - 使用 Firebird Trace 和 Audit 服务进行数据库复制
- reactjs - React 更改一个子组件中的状态并将其传递给另一个子组件
- google-cloud-run - 有没有办法将 IP 地址列入白名单来访问 Cloud Run 服务?
- hadoop - 我在猪中使用过滤器时遇到错误,当我转储结果时它会出错
- phpstorm - 如何在 PhpStorm 中的变量和运算符之间留出空间?
- swift - 如何从另一个视图控制器中删除表格视图中的单元格?
- python - 如何在 df1 的 c1 列中分别合并两个数据帧 df1 和 df2 的两列 c1 和 c2 ?c1 和 c2 是字典
- python - 需要从函数返回的列表的多处理 Pandas 数据帧输出
- django - url 调度程序如何包含应用程序 url