Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QScrollArea causes crash on close()
QtWS25 Last Chance

QScrollArea causes crash on close()

Scheduled Pinned Locked Moved Solved General and Desktop
5 Posts 2 Posters 595 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • U Offline
    U Offline
    umod.47
    wrote on last edited by
    #1

    Hello.
    In my application, I have a window with a QScrollArea, that contains some labels to be scrolled. Let's name it "ScrollForm". The ScrollForm can be shown from the main window.
    The problem is: if I close the ScrollForm using cross in the corner and then reopen it from the main window (using ScrollForm::show()), ScrollForm is not being rendered, and interacting with it causes application to crash. The debugger doesn't show anything useful, it crashes somewhere deep inside Qt.
    However, if I call ScrollForm::hide() and then ScrollForm::show(), everything works fine.
    I was able to make a workaround by caatching QCloseEvent and ignoring it, hiding ScrollForm instead. However, the Qt manual states that there's no difference between close() and hide() if Qt::WA_DeleteOnClose is disabled (which is the default).
    I've tried to disable Qt::WA_DeleteOnClose explicitly, but the behaviour is the same: calling close() and hide() breaks down the window.
    Here is the sample code. The commented blocks of code are a workaround:

    // scrollform.h
    #pragma once
    
    #include <QWidget>
    
    namespace Ui {
    class ScrollForm;
    }
    
    class ScrollForm : public QWidget
    {
      Q_OBJECT
    
    public:
      explicit ScrollForm(QWidget *parent = nullptr);
      ~ScrollForm();
    
    //protected:
    //  void closeEvent(QCloseEvent*);
    
    private:
      Ui::ScrollForm *ui;
    };
    
    // scrollform.cpp
    #include "scrollform.h"
    #include "ui_scrollform.h"
    #include <QVBoxLayout>
    #include <QLabel>
    #include <QCloseEvent>
    
    ScrollForm::ScrollForm(QWidget *parent) :
      QWidget(parent),
      ui(new Ui::ScrollForm)
    {
      ui->setupUi(this);
      setAttribute(Qt::WA_DeleteOnClose, false);
    
      QWidget* w = new QWidget;
      w->setAttribute(Qt::WA_DeleteOnClose, false);
      ui->scrollArea->setWidget(w);
      ui->scrollArea->setAttribute(Qt::WA_DeleteOnClose, false);
    
      QVBoxLayout* vbl = new QVBoxLayout(w);
      vbl->setSizeConstraint(QLayout::SetMinAndMaxSize);
    
      for(int a=0; a<100; a++)
      {
        QLabel* l = new QLabel();
        l->setAttribute(Qt::WA_DeleteOnClose, false);
        l->setText(tr("This is a label number %1").arg(a+1));
        vbl->addWidget(l);
      }
    
    }
    
    ScrollForm::~ScrollForm()
    {
      delete ui;
    }
    
    //void ScrollForm::closeEvent(QCloseEvent *e)
    //{
    //  e->ignore();
    //  hide();
    //}
    

    Using Linux Mint 19.1 Qt 5.12, clang 6.0.0 or gcc 7.4.0
    However, using system-provided Qt 5.9 doesn't cause this bug. Everything works fine.

    Press ESCAPE to enter or ENTER to escape.
    Keyboard not found. Press F1 to continue.
    (c) BIOS

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      What Qt5.12 version exactly? Can you show us the backtrace?

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      0
      • U Offline
        U Offline
        umod.47
        wrote on last edited by umod.47
        #3

        Qt version 5.12.4 GCC 64 bit

        Here is the call stack at the app crash (show, close, show, scroll with mouse wheel somewhere in an unpainted window).
        Everything except main.cpp is grayed out.

        1  QWidgetBackingStore::markDirtyOnScreen                 qwidgetbackingstore.cpp    727  0x7ffff76f67a3 
        2  QWidgetPrivate::moveRect                               qwidgetbackingstore.cpp    919  0x7ffff76f8ca1 
        3  QWidgetPrivate::setGeometry_sys                        qwidget.cpp                7351 0x7ffff771c6bd 
        4  QWidget::move                                          qwidget.cpp                7182 0x7ffff771c974 
        5  QWidget::move                                          qwidget.h                  836  0x7ffff78679df 
        6  QScrollAreaPrivate::updateWidgetPosition               qscrollarea.cpp            181  0x7ffff78679df 
        7  QAbstractScrollAreaPrivate::_q_vslide                  qabstractscrollarea.cpp    1542 0x7ffff77cb311 
        8  QMetaObject::activate                                  qobject.cpp                3801 0x7ffff68404e9 
        9  QMetaObject::activate                                  qobject.cpp                3654 0x7ffff6840df7 
        10 QAbstractSlider::valueChanged                          moc_qabstractslider.cpp    308  0x7ffff77d058e 
        11 QAbstractSlider::setValue                              qabstractslider.cpp        546  0x7ffff77d0bc7 
        12 QAbstractSlider::triggerAction                         qabstractslider.cpp        635  0x7ffff77d0e02 
        13 QAbstractSliderPrivate::scrollByDelta                  qabstractslider.cpp        750  0x7ffff77d17f9 
        14 QScrollBar::wheelEvent                                 qscrollbar.cpp             509  0x7ffff7868c2c 
        15 QWidget::event                                         qwidget.cpp                9325 0x7ffff7724790 
        16 QAbstractSlider::event                                 qabstractslider.cpp        955  0x7ffff77d1955 
        17 QScrollBar::event                                      qscrollbar.cpp             490  0x7ffff786a8e2 
        18 QApplicationPrivate::notify_helper                     qapplication.cpp           3737 0x7ffff76e69ac 
        19 QApplication::notify                                   qapplication.cpp           3290 0x7ffff76ef464 
        20 QCoreApplication::notifyInternal2                      qcoreapplication.cpp       1084 0x7ffff6814a28 
        21 QWidget::event                                         qwidget.cpp                9325 0x7ffff7724790 
        22 QFrame::event                                          qframe.cpp                 550  0x7ffff77c8e9e 
        23 QCoreApplicationPrivate::sendThroughObjectEventFilters qcoreapplication.cpp       1210 0x7ffff68147bd 
        24 QApplicationPrivate::notify_helper                     qapplication.cpp           3731 0x7ffff76e6985 
        25 QApplication::notify                                   qapplication.cpp           3290 0x7ffff76ef464 
        26 QCoreApplication::notifyInternal2                      qcoreapplication.cpp       1084 0x7ffff6814a28 
        27 QCoreApplication::forwardEvent                         qcoreapplication.cpp       1099 0x7ffff6814a72 
        28 QWidgetWindow::handleWheelEvent                        qwidgetwindow.cpp          848  0x7ffff773f6a6 
        29 QWidgetWindow::event                                   qwidgetwindow.cpp          308  0x7ffff7740cd3 
        30 QApplicationPrivate::notify_helper                     qapplication.cpp           3737 0x7ffff76e69ac 
        31 QApplication::notify                                   qapplication.cpp           3483 0x7ffff76edaa0 
        32 QCoreApplication::notifyInternal2                      qcoreapplication.cpp       1084 0x7ffff6814a28 
        33 QCoreApplication::sendSpontaneousEvent                 qcoreapplication.cpp       1484 0x7ffff6814bee 
        34 QGuiApplicationPrivate::processWheelEvent              qguiapplication.cpp        2185 0x7ffff6e8b177 
        35 QGuiApplicationPrivate::processWindowSystemEvent       qguiapplication.cpp        1845 0x7ffff6e90115 
        36 QWindowSystemInterface::sendWindowSystemEvents         qwindowsysteminterface.cpp 1151 0x7ffff6e6d76b 
        37 xcbSourceDispatch                                      qxcbeventdispatcher.cpp    105  0x7ffff0a2ecba 
        38 g_main_context_dispatch                                                                0x7ffff28a4417 
        39 ??                                                                                     0x7ffff28a4650 
        40 g_main_context_iteration                                                               0x7ffff28a46dc 
        41 QEventDispatcherGlib::processEvents                    qeventdispatcher_glib.cpp  422  0x7ffff686be3f 
        42 QEventLoop::exec                                       qeventloop.cpp             225  0x7ffff68132ea 
        43 QCoreApplication::exec                                 qcoreapplication.cpp       1385 0x7ffff681bd30 
        44 main                                                   main.cpp                   10   0x403baa       
        
        

        Press ESCAPE to enter or ENTER to escape.
        Keyboard not found. Press F1 to continue.
        (c) BIOS

        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @umod-47 said in QScrollArea causes crash on close():

          show, close, show, scroll

          Well-known problem with Qt5.12.3/.4 - upgrade to 5.12.5. See QTBUG-76588

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          U 1 Reply Last reply
          3
          • Christian EhrlicherC Christian Ehrlicher

            @umod-47 said in QScrollArea causes crash on close():

            show, close, show, scroll

            Well-known problem with Qt5.12.3/.4 - upgrade to 5.12.5. See QTBUG-76588

            U Offline
            U Offline
            umod.47
            wrote on last edited by
            #5

            @Christian-Ehrlicher
            Indeed, updating to 5.12.5 solved the problem. Thanks!

            Press ESCAPE to enter or ENTER to escape.
            Keyboard not found. Press F1 to continue.
            (c) BIOS

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved