Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-108079

QWindow sends paintEvent and exposeEvent two times when shrinking

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P3: Somewhat important
    • None
    • 6.2.4, 6.4.0
    • GUI: Window management
    • None
    • Windows 10, 4K display (I haven't tested it on low res. display yet), system scaling 100 % (i.e. device pixel ratio = 1)
    • Windows

    Description

      Minimum reproducible example:

      #include <QExposeEvent>
      #include <QGuiApplication>
      #include <QPaintEvent>
      #include <QResizeEvent>
      #include <QWindow>
      
      class Window : public QWindow
      {
      protected:
        void paintEvent(QPaintEvent *event) override
        { qDebug() << event; QWindow::paintEvent(event); }
      
        void exposeEvent(QExposeEvent *event) override
        { qDebug() << event; QWindow::exposeEvent(event); }
      
        void resizeEvent(QResizeEvent *event) override
        { qDebug() << event; QWindow::resizeEvent(event); }
      };
      
      int main(int argc, char *argv[])
      {
        QGuiApplication a(argc, argv);
        Window w;
        w.show();
        return a.exec();
      }
      

      Steps to reproduce:
      1) Run the code
      2) Grip the edge of the window with a mouse and drag it to EXPAND the window width or height-> each event is logged once per window size change
      3) Grip the edge of the window with a mouse and drag it to SHRINK the window width or height -> resize event is logged once but paint event and expose event are logged TWICE for each window size change

      Example output when EXPANDING:

      QResizeEvent(1169, 603)
      QPaintEvent(QRegion(0,0 1169x603))
      QExposeEvent(QRegion(0,0 1169x603))
      QResizeEvent(1173, 603)
      QPaintEvent(QRegion(0,0 1173x603))
      QExposeEvent(QRegion(0,0 1173x603))
      QResizeEvent(1177, 603)
      QPaintEvent(QRegion(0,0 1177x603))
      QExposeEvent(QRegion(0,0 1177x603))
      

      Example of output when SHRINKING:

      QResizeEvent(942, 603)
      QPaintEvent(QRegion(0,0 942x603))
      QExposeEvent(QRegion(0,0 942x603))
      QPaintEvent(QRegion(0,0 942x603))
      QExposeEvent(QRegion(0,0 942x603))
      QResizeEvent(941, 603)
      QPaintEvent(QRegion(0,0 941x603))
      QExposeEvent(QRegion(0,0 941x603))
      QPaintEvent(QRegion(0,0 941x603))
      QExposeEvent(QRegion(0,0 941x603))
      QResizeEvent(939, 603)
      QPaintEvent(QRegion(0,0 939x603))
      QExposeEvent(QRegion(0,0 939x603))
      QPaintEvent(QRegion(0,0 939x603))
      QExposeEvent(QRegion(0,0 939x603))
      

      The expected output when SHRINKING would be:

      QResizeEvent(942, 603)
      QPaintEvent(QRegion(0,0 942x603))
      QExposeEvent(QRegion(0,0 942x603))
      QResizeEvent(941, 603)
      QPaintEvent(QRegion(0,0 941x603))
      QExposeEvent(QRegion(0,0 941x603))
      QResizeEvent(939, 603)
      QPaintEvent(QRegion(0,0 939x603))
      QExposeEvent(QRegion(0,0 939x603))
      

      I believe that the number of events should be the same for expanding and shrinking, i.e. one for each size change. Also on Linux (X11) and macOS, the events are emitted only once so the problem seems to be only on Windows. The consequence of this bug is that when someone overrides window event handlers to do some painting, then this might cause unnecessary repainting.

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            vestbo Tor Arne Vestbø
            vladimir.kraus Vladimir Kraus
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes