Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt5 "Attempt to set a screen on a child window" many runtime warning messages

Tags:

qt5

In our Qt5-based application, many messages like this are displayed in the console:

0x1beccb0 void QWindowPrivate::setTopLevelScreen(QScreen*, bool) ( QScreen(0xd25b80) ): Attempt to set a screen on a child window.

It does not prevent the application from running, but I would like to fix them, since it tends to indicate that there is probably something wrong that we are doing. The code is quite large (cannot be included in the post, it is there: http://gforge.inria.fr/frs/?group_id=1465). I cannot ask you to take a look at it (too big), but maybe you will have an idea with the following additional information:

  1. The messages appear only under Linux, and not under Windows

  2. Our application is a 3D modeler, that has several QGLWidgets for displaying 3D content. If I remove the QGLWidgets, then the messages disappear.

  3. In the debugger, if I put a breakpoint on QWindowPrivate::setTopLevelScreen(), it is called by:

    kernel/qwindow.cpp:368 368 q->connect(screen, SIGNAL(destroyed(QObject*)), q, SLOT(screenDestroyed(QObject*)));

Update1: I put a breakpoint on QMessageLogger::warning (qDebug() is a macro that uses this function), now I can better see the stack that looks like:

#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...)

In QGuiApplicationPrivate::processWindowSystemEvent, it is handling a QWindowSystemInterfacePrivate::ThemeChange event:

1608        case QWindowSystemInterfacePrivate::ThemeChange:
1609            QGuiApplicationPrivate::processThemeChanged(
1610                        static_cast<QWindowSystemInterfacePrivate::ThemeChangeEvent *>(e));
1611            break;

Update2: Nearly there !! It is when I call setMinimumWidth() / setMinimumHeight() on a QGLWidget. Now I'd like to know why...

Update3: More information: the messages are only displayed when I have two screens connected to my computer.

like image 515
BrunoLevy Avatar asked Nov 05 '15 12:11

BrunoLevy


1 Answers

Finally, I understood what happens:

  • The warning messages occur whenever setMinimumWidth() / setMinimumHeight() are called on a QGLWidget under Linux with a dual screen display.

This is probably a bug in Qt. It will probably be not fixed, since it is recommended in the documentation to use the new QOpenGLWidget instead, that appeared in Qt 5.4 (note: "OpenGL" instead of "GL"), which I did and the warning messages disappeared.

Edit: I saw a message from someone that had problems with text not rendering properly with the new QOpenGLWidget which I answer here: When using the new QOpenGLWidget, one needs to take care that it no longer has an independent OpenGL context, it shares the OpenGL context with Qt (therefore, OpenGL states modified in the rendering function needs to be restored after exiting the rendering function, for instance blending mode).

like image 141
BrunoLevy Avatar answered Sep 20 '22 06:09

BrunoLevy