2015-11-05 5 views
8

Nella nostra applicazione QT5-based, molti messaggi di questo tipo vengono visualizzati nella console:QT5 "tenta di impostare uno schermo su una finestra secondaria" molti messaggi di avviso runtime

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

Esso non impedisce l'applicazione da correndo, ma vorrei correggerli, poiché tende a indicare che probabilmente c'è qualcosa di sbagliato che stiamo facendo. Il codice è abbastanza grande (non può essere incluso nel post, è lì: http://gforge.inria.fr/frs/?group_id=1465). Non posso chiedere di dare un'occhiata a questo (troppo grande), ma forse si avrà un'idea con le seguenti informazioni aggiuntive:

  1. I messaggi appaiono solo sotto Linux, e non sotto Windows

  2. La nostra applicazione è un modellatore 3D, che ha diversi QGLWidgets per che visualizzano il contenuto 3D. Se rimuovo QGLWidgets, i messaggi scompaiono.

  3. Nel debugger, se metto un punto di interruzione QWindowPrivate :: setTopLevelScreen(), viene chiamato da:

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

Update1: ho messo un punto di interruzione QMessageLogger :: avvertimento (qDebug() è una macro che utilizza questa funzione), ora posso vedere meglio lo stack che assomiglia:

#0 0x00007fffefa50600 in QMessageLogger::warning() [email protected]() 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 ([email protected]=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, sta gestendo un evento QWindowSystemInterfacePrivate :: ThemeChange:

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

Update2: Quasi lì !! È quando chiamo setMinimumWidth()/setMinimumHeight() su un QGLWidget. Ora mi piacerebbe sapere il motivo per cui ...

Update3: Maggiori informazioni: i messaggi sono visualizzati solo quando ho due schermi collegati al mio computer.

risposta

7

Infine, ho capito che cosa succede:

  • I messaggi di avviso ogni volta che si verificano setMinimumWidth()/setMinimumHeight() sono chiamati su un QGLWidget sotto Linux con un display a doppio schermo.

Questo è probabilmente un bug in Qt. Probabilmente non sarà corretto, dal momento che nella documentazione è raccomandato l'uso del nuovo QOpenGLWidget, che è apparso in Qt 5.4 (nota: "OpenGL" invece di "GL"), cosa che ho fatto e i messaggi di avvertimento sono scomparsi.

Edit: ho visto un messaggio da qualcuno che ha avuto problemi con il testo non è il rendering correttamente con il nuovo QOpenGLWidget che rispondo qui: Quando si utilizza la nuova QOpenGLWidget, uno ha bisogno di fare in modo che essa non ha più un'OpenGL indipendenti contesto, condivide il contesto OpenGL con Qt (pertanto, gli stati OpenGL modificati nella funzione di rendering devono essere ripristinati dopo essere usciti dalla funzione di rendering, ad esempio la modalità di fusione).

Problemi correlati