skip to Main Content

An image often being the easiest way to explain something, here is a little screengrab of the problem I’m having:

laggy resize

If you look at the right side of the window, you can see that the content is resized with a visible lag / delay. It’s a problem that happens in quite a lot of applications, but I was wondering if there is a way to fix this in a Qt application using QQuickView and QML content.

Basically my application is created like this:

QQuickView view;
view.resize(400, 200);
view.setResizeMode(QQuickView::ResizeMode::SizeRootObjectToView);
view.setSource(...);

The QML’s content is just an item with 2 rectangles to highlight the problem.

Edit: here is a simplified version of the QML file (yes, the simplified version also suffers from the same problem ;p)

import QtQuick 2.12
Item {
    Rectangle {
        color: "black"
        anchors { fill: parent; margins: 10 }
    }
}

Edit2: Running this small QML snippet through the qmlscene executable also shows the same delay / lag.

Edit3: The same problem occurs on some Linux distros but not on some others: on my Ubuntu it works fine, but on my CentOS 7 is shows the same delay / glitches as on Windows. Both Qt version were 5.12.3. On an old OSX it works fine (tested on Qt 5.9) I’m really lost now ^^

Is there any way to prevent this kind of delay ? The solution will probably be platform specific since it seems the problem comes from the fact that the native frame is resized before Qt has the possibility to get the event, and so the content gets resized with a 1 frame delay … but I’d like to know if anyone has an idea on how to handle this ?

Any help or pointer appreciated 🙂

Regards,
Damien

2

Answers


  1. As you mentioned in your update – content gets resized with a 1 frame delay.
    And there is a quite simple hack to handle this.
    Use nativeEventFilter, handle
    WM_NCCALCSIZE with pMsg->wParam == TRUE and remove 1px from top or from bottom.

    if( pMsg->message == WM_NCCALCSIZE and pMsg->wParam == TRUE )
    {
        LPNCCALCSIZE_PARAMS szr = NULL;
        szr = reinterpret_cast<LPNCCALCSIZE_PARAMS>( pMsg->lParam );
        if( szr->rgrc[0].top != 0 )
        {
            szr->rgrc[0].top -= 1;
        }
    }
    

    Regards, Anton

    Login or Signup to reply.
  2. QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
    QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
    

    There is no obvious lag after I use OpenGL.

    If so, try the following code:

    if (msg == WM_NCCALCSIZE) {
       *result = WVR_REDRAW;
       return true;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search