Qt5 "Attempt to set a screen on a child window" 许多运行时警告消息
Qt5 "Attempt to set a screen on a child window" many runtime warning messages
在我们基于Qt5的应用程序中,控制台中显示了很多这样的消息:
0x1beccb0 void QWindowPrivate::setTopLevelScreen(QScreen*, bool) ( QScreen(0xd25b80) ): Attempt to set a screen on a child window.
它不会阻止应用程序 运行,但我想修复它们,因为它往往表明我们可能做错了什么。代码相当大(无法包含在 post 中,它在那里:http://gforge.inria.fr/frs/?group_id=1465)。我不能让你看一下(太大了),但也许你会对以下附加信息有一个想法:
消息仅出现在 Linux 下,而不出现在 Windows
下
我们的应用程序是一个 3D 建模器,它有几个 QGLWidgets
显示 3D 内容。如果我删除 QGLWidgets,那么消息
消失。
在调试器中,如果我在
QWindowPrivate::setTopLevelScreen(),调用者:
kernel/qwindow.cpp:368
第368话
更新1:
我在 QMessageLogger::warning 上设置了一个断点(qDebug() 是一个使用这个函数的宏),现在我可以更好地看到看起来像这样的堆栈:
#0 0x00007fffefa50600 in QMessageLogger::warning() const@plt () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#1 0x00007fffefa851cb in QWindowPrivate::setTopLevelScreen (this=0xd330e0, newScreen=0x7201a0, recreate=<optimized out>)
at kernel/qwindow.cpp:371
#2 0x00007fffefa7f2f5 in QGuiApplicationPrivate::processWindowSystemEvent (e=e@entry=0x760600)
at kernel/qguiapplication.cpp:1608
#3 0x00007fffefa631f8 in QWindowSystemInterface::sendWindowSystemEvents (flags=...)
at kernel/qwindowsysteminterface.cpp:625
#4 0x00007fffeb7d4100 in userEventSourceDispatch (source=<optimized out>)
at eventdispatchers/qeventdispatcher_glib.cpp:70
(More stack frames follow...)
在 QGuiApplicationPrivate::processWindowSystemEvent 中,它正在处理一个 QWindowSystemInterfacePrivate::ThemeChange 事件:
1608 case QWindowSystemInterfacePrivate::ThemeChange:
1609 QGuiApplicationPrivate::processThemeChanged(
1610 static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
1611 break;
更新2:
就快到了 !!当我在 QGLWidget 上调用 setMinimumWidth() / setMinimumHeight() 时。现在我想知道为什么...
更新3:
更多信息:仅当我的计算机连接了两个屏幕时才会显示消息。
终于明白是怎么回事了:
- 只要在 Linux 双屏显示下的 QGLWidget 上调用 setMinimumWidth() / setMinimumHeight() 时就会出现警告消息。
这可能是 Qt 中的一个错误。它可能不会被修复,因为文档中建议使用 Qt 5.4 中出现的新 QOpenGLWidget(注意:"OpenGL" 而不是 "GL"),我这样做了,并且警告消息消失了。
编辑: 我看到有人发来一条消息,说文本无法使用新的 QOpenGLWidget 正确呈现,我在这里回答:使用新的 QOpenGLWidget 时,需要采取注意它不再有独立的OpenGL上下文,它与Qt共享OpenGL上下文(因此,在退出渲染函数后需要恢复在渲染函数中修改的OpenGL状态,例如混合模式)。
在我们基于Qt5的应用程序中,控制台中显示了很多这样的消息:
0x1beccb0 void QWindowPrivate::setTopLevelScreen(QScreen*, bool) ( QScreen(0xd25b80) ): Attempt to set a screen on a child window.
它不会阻止应用程序 运行,但我想修复它们,因为它往往表明我们可能做错了什么。代码相当大(无法包含在 post 中,它在那里:http://gforge.inria.fr/frs/?group_id=1465)。我不能让你看一下(太大了),但也许你会对以下附加信息有一个想法:
消息仅出现在 Linux 下,而不出现在 Windows
下
我们的应用程序是一个 3D 建模器,它有几个 QGLWidgets 显示 3D 内容。如果我删除 QGLWidgets,那么消息 消失。
在调试器中,如果我在 QWindowPrivate::setTopLevelScreen(),调用者:
kernel/qwindow.cpp:368 第368话
更新1: 我在 QMessageLogger::warning 上设置了一个断点(qDebug() 是一个使用这个函数的宏),现在我可以更好地看到看起来像这样的堆栈:
#0 0x00007fffefa50600 in QMessageLogger::warning() const@plt () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#1 0x00007fffefa851cb in QWindowPrivate::setTopLevelScreen (this=0xd330e0, newScreen=0x7201a0, recreate=<optimized out>)
at kernel/qwindow.cpp:371
#2 0x00007fffefa7f2f5 in QGuiApplicationPrivate::processWindowSystemEvent (e=e@entry=0x760600)
at kernel/qguiapplication.cpp:1608
#3 0x00007fffefa631f8 in QWindowSystemInterface::sendWindowSystemEvents (flags=...)
at kernel/qwindowsysteminterface.cpp:625
#4 0x00007fffeb7d4100 in userEventSourceDispatch (source=<optimized out>)
at eventdispatchers/qeventdispatcher_glib.cpp:70
(More stack frames follow...)
在 QGuiApplicationPrivate::processWindowSystemEvent 中,它正在处理一个 QWindowSystemInterfacePrivate::ThemeChange 事件:
1608 case QWindowSystemInterfacePrivate::ThemeChange:
1609 QGuiApplicationPrivate::processThemeChanged(
1610 static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
1611 break;
更新2: 就快到了 !!当我在 QGLWidget 上调用 setMinimumWidth() / setMinimumHeight() 时。现在我想知道为什么...
更新3: 更多信息:仅当我的计算机连接了两个屏幕时才会显示消息。
终于明白是怎么回事了:
- 只要在 Linux 双屏显示下的 QGLWidget 上调用 setMinimumWidth() / setMinimumHeight() 时就会出现警告消息。
这可能是 Qt 中的一个错误。它可能不会被修复,因为文档中建议使用 Qt 5.4 中出现的新 QOpenGLWidget(注意:"OpenGL" 而不是 "GL"),我这样做了,并且警告消息消失了。
编辑: 我看到有人发来一条消息,说文本无法使用新的 QOpenGLWidget 正确呈现,我在这里回答:使用新的 QOpenGLWidget 时,需要采取注意它不再有独立的OpenGL上下文,它与Qt共享OpenGL上下文(因此,在退出渲染函数后需要恢复在渲染函数中修改的OpenGL状态,例如混合模式)。