Cannot disable QGraphicsSimpleText antialiasing with Qt5.x
-
Hi all,
I'm trying to implement a widget which should:
- display a picture from raw pgm-like data;
- superimpose zones of interest with a reticle-like object and a small text.
The pictures are roughly full HD, and the number of zones of interest usually varies between 3 and 16.
After looking out for information, I somehow decided to go for the Graphics View Framework: I draw the picture using a QGraphicsPixmapItem (updated regularly), the zones of interest use a custom QGraphicsItem subclass and the text uses QGraphicsSimpleTextItem instances those are updated at the same time as the picture. In order to avoid to blow up the memory, I first update the position / texts of pre-existing items instead of creating new ones and I only update the pixmap.
I've had OpenGL performance issues with some hardware, this is why I don't use OpenGL to display the view. The default implementation won't use OpenGL and let the CPU perform the rendering.
I have an option to disable the antialiasing of the view (triggered by right-clicking on the widget), the code which toggles on / off the antialiasing looks like this:
void PictureDisplay::toggleSmoothing() { QPainter::RenderHints hints( renderHints() ); hints ^= QPainter::Antialiasing; hints ^= QPainter::TextAntialiasing; hints ^= QPainter::SmoothPixmapTransform; hints ^= QPainter::HighQualityAntialiasing; setRenderHints( hints ); QFont font( "Arial", 18 ); if ( ( hints & QPainter::HighQualityAntialiasing ) != 0 ) { font.setStyleStrategy( QFont::PreferAntialias ); foreach ( QGraphicsSimpleTextItem* item, OverlaidTexts ) { item->setFont( font ); } PixmapItem->setTransformationMode( Qt::SmoothTransformation ); } else { font.setStyleStrategy( QFont::NoAntialias ); foreach ( QGraphicsSimpleTextItem* item, OverlaidTexts ) { item->setFont( font ); } PixmapItem->setTransformationMode( Qt::FastTransformation ); } }
I've tested this code with Qt 5.6.0 64bits on Windows 8.1 using MSVC 2013, Qt 5.4.2 64bits on Mageia 5 using both gcc 4.9 and clang 3.5, Qt 4.8.6 64bits on Mageia 5 using gcc 4.9.
Now, here's the catch:- the Windows Qt 5.6 version does not disable text antialiasing, unless I use the OpenGL viewport;
- the Linux Qt 5.4 version does not disable text antialiasing (and I have no OpenGL output, i.e. blank widget, but never mind);
- the Linux Qt 4.8 does disable text antialiasing (and I have no OpenGL output, i.e. blank widget, but never mind).
I've already spent some time reading the documentation (for both 4.8 and 5.6) with no luck, everybody seems to agree that
font.setStyleStrategy( QFont::NoAntialias );
should disable the text antialiasing for whatever Qt version.Can someone show me where I did wrong?
Thanks in advance,
johan
-
Hi,
The backends between Qt 4 and 5 have changed so you might have unearthed something. I'd recommend taking a look at the bug report system to see if it's something known.
-
For the recored, filed QTBUG-53845