在我们基于Qt5的应用程序中,许多这样的消息都显示在控制台中:
0x1beccb0 void QWindowPrivate::setTopLevelScreen(QScreen*, bool) ( QScreen(0xd25b80) ): Attempt to set a screen on a child window.
Run Code Online (Sandbox Code Playgroud)
它不会阻止应用程序运行,但我想修复它们,因为它往往表明我们正在做的事情可能有些不对劲.代码非常大(不能包含在帖子中,它在那里:http://gforge.inria.fr/frs/?group_id = 1465).我不能要求你看一下(太大了),但也许你会对以下附加信息有所了解:
消息仅在Linux下出现,而不在Windows下出现
我们的应用程序是一个3D建模器,它有几个用于显示3D内容的QGLWidgets.如果我删除了QGLWidgets,那么消息就会消失.
在调试器中,如果我在QWindowPrivate :: setTopLevelScreen()上放置一个断点,它将被调用:
kernel/qwindow.cpp:368 368 q-> connect(screen,SIGNAL(destroyed(QObject*)),q,SLOT(screenDestroyed(QObject*)));
Update1: 我在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...)
Run Code Online (Sandbox Code Playgroud)
在QGuiApplicationPrivate :: processWindowSystemEvent中,它正在处理QWindowSystemInterfacePrivate :: ThemeChange事件:
1608 case QWindowSystemInterfacePrivate::ThemeChange:
1609 QGuiApplicationPrivate::processThemeChanged(
1610 static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
1611 break;
Run Code Online (Sandbox Code Playgroud)
Update2: 几乎就在那里!! 当我在QGLWidget上调用setMinimumWidth()/ setMinimumHeight()时.现在我想知道为什么 ......
Update3: 更多信息:只有在我的计算机连接了两个屏幕时才会显示消息.
最后,我明白了会发生什么:
这可能是Qt中的一个错误.它可能没有修复,因为在文档中建议使用新的QOpenGLWidget,它出现在Qt 5.4(注意:"OpenGL"而不是"GL")中,我做了,警告消息消失了.
编辑:我看到来自某人的消息,文本无法使用新的QOpenGLWidget正确呈现,我在这里回答:当使用新的QOpenGLWidget时,需要注意它不再具有独立的OpenGL上下文,它共享OpenGL使用Qt的上下文(因此,在退出渲染函数后需要恢复渲染函数中修改的OpenGL状态,例如混合模式).
| 归档时间: |
|
| 查看次数: |
4713 次 |
| 最近记录: |