[Interest] High-dpi fixing for Qt 5.5

Till Oliver Knoll till.oliver.knoll at gmail.com
Tue Mar 24 17:01:26 CET 2015



> Am 24.03.2015 um 15:46 schrieb Agocs Laszlo <laszlo.agocs at theqtcompany.com>:
> 
> Because Qt 3D most likely misses a few multiplications by devicePixelRatio(). Probably easy to correct.
>  
> See http://www.qtdeveloperdays.com/sites/default/files/presentation_pdf/AgocsLaszlo_opengl_enablers_news.pdf#26
> 

Hi Laszlo,

Thanks for the slides! They seem to contain the (partial) answer I was looking for: how to get notified when the screen (and hence possibly the resolution) changes.

For QWindow based applications the answer seems to be

 http://doc.qt.io/qt-5/qwindow.html#screenChanged

For QWidget based applications however your slides suggest to "watch out for [...] ScreenChangeInternal event for QWidget". I assume this is "for Qt internal use only".

In fact I found a change (by you ;)) from about 6 months ago which seems to introduce that "ScreenChangeInternal" event:

 https://qt.gitorious.org/qt/qtbase/commit/49194275e02a9d6373767d6485bd8ebeeb0abba5

"Unlike ordinary widgets, the ones that have OpenGL framebuffers must know about screen changes because the device pixel ratio may be different on the new screen. Add an internal event, ScreenChangeInternal, as the counterpart to WindowChangeInternal."


Is or will this event be exposed to the public QWidget API?


Again, I am not sure whether I need to care (on an application level) at all about this use case (switch between monitors/screens with different resolution), but I strongly assume so: I create QPixmaps as needed (using a QPainter) and store them ("cache") in the corresponding QGrapicsPixmapItem. So when the resolution changes I would re-create those QPixmaps with the desired resolution.

Then again, if I was to draw the QPixmap myself, I would use a QIcon (with the app attribute "Qt::AA_UseHighDpiPixmaps" enabled) to choose between the desired QPixmaps, as in:

 QRect destinationRect = ...
 QIcon icon = ...
 painter.drawPixmap(destinationRect, icon.pixmap(destinationRect.size()));

[http://blog.qt.io/blog/2013/04/25/retina-display-support-for-mac-os-ios-and-x11/]

But since the QGraphicsPixmapItem is doing the drawing for me, I probably really need to get informed about resolution changes, and replace the pixmaps in the QGraphicsViewItem myself as needed (unless I am overseeing some other, simpler solution here). Or maybe if I would overwrite the QGraphicsPixmapItem::paint() method and use something like the above code... but that would almost defy the reason why I would use a QGraphicsPixmapItem in the first place... (I could derive from QGraphicsItem then directly instead).


Any thoughts or ideas?


Thanks, Oliver
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150324/81cd7715/attachment.html>


More information about the Interest mailing list