Cannot disable QGraphicsSimpleText antialiasing with Qt5.x



  • Hi all,

    I'm trying to implement a widget which should:

    1. display a picture from raw pgm-like data;
    2. 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


  • Lifetime Qt Champion

    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.



  • Hi Samuel,

    thank you for the answer. I've already give a quick look at the bug tracker and didn't find any related bug. I'll give another try an file a new bug if needed.

    Merci!



  • For the recored, filed QTBUG-53845



Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.