Qt World Summit: Submit your Presentation

Graphics glitch in QLabel (showing old image data when calling setText())

  • Hi! I have an application that shows images on a QLabel. Every once in a while, no image is available, and the label clears and displays some text ('no image'). I noticed that whenever this happens, a previous image appears on the label for a fraction of a second between the current image and the new text contents.

    I tried to setUpdatesEnabled(false) before the setText() call, and reenabling updates after, but the results are the same. I also tried to QPixmapCache::clear(), but I don't think that does what I thought it does and doesn't work anyway.

    I recorded a little video of it here: https://www.youtube.com/watch?v=LRZi4hHD29o

    The code used in the video is the following (to run this, you would need to add two images, 1.jpg and 2.jpg, to the application directory).

    // main.cc
    #include "button.h"
    int main(int argc, char *argv[])
      QApplication app(argc, argv);
      QMainWindow mw;
      QLabel *l = new QLabel(&mw);
      l->setFixedSize(300, 300);
      Button *b = new Button(l, &mw);
      QObject::connect(b, SIGNAL(clicked()), b, SLOT(next()));
      QGridLayout *layout = new QGridLayout(&mw);
      QWidget *w = new QWidget(&mw);
      return app.exec();
    #include <QtGui>
    class Button : public QPushButton
      int count;
      QLabel *label;
      QPixmap pm;
      Button(QLabel *l, QWidget *parent = 0)
        : QPushButton("NEXT", parent), count(0), label(l)
     public slots:
      void next()
        if (count % 3 == 0)
          if (pm.load("1.jpg"))
            label->setPixmap(pm.scaled(label->size(), Qt::KeepAspectRatio));
        else if (count % 3 == 1)
          if (pm.load("2.jpg"))
            label->setPixmap(pm.scaled(label->size(), Qt::KeepAspectRatio));
        else if (count % 3 == 2)
          label->setText("NO IMAGE");

    Does anyone have an idea how to solve this? The issue was observed under X11 by the way, I don't know if it happens on other platforms.


  • Hi. Can't access the video, it's private.

  • @Wieland Hi! Sorry, that was my first time on youtube. It should be fixed now. Thanks!

  • I see. That's obviously a bug. The question remains if it's a bug in Qt or somewhere else in the graphics stack. Maybe this bug is already in our bug database. See https://bugreports.qt.io. What graphics driver do you use? The Nvidia drivers caused a lot of problems in the past.

    As a workaround, have you tried to assign a null pixmap?

    else if (count % 3 == 2)
           pm = QPixmap();
           label->setText("NO IMAGE");

  • Thanks for the reply. This is using intel graphics, and unfortunately your workaround does not help. After your message, I've tested the same code from a newer live image and also on my more up-to-date laptop (which has similar hardware) and I can not reproduce the issue in either of these cases. On the affected machine, I tried updating the intel driver and mesa, but this did not solve it, so I guess it probably needs the kernel or qt packages updated as well. Unfortunately, this is not an option at this point.

    I've worked around the issue by re-implementing paintEvent() to do something like the following

    if (no_pixmap_set)
      pos = calculateTextPosition()
      QPainter::drawText(pos, text);

    Which seems to work just fine. In fact, re-implementing the paintEvent has given me the chance to animate the image changes which looks pretty nice, and it will be easy to simplify the code a bit when all my machines are fully updated and the glitch is gone.

    Thanks again!

Log in to reply