Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct


    Qt World Summit: Early-Bird Tickets

    Solved QScrollArea causes crash on close()

    General and Desktop
    2
    5
    249
    Loading More Posts
    • 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
      umod.47 last edited by

      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 Reply Quote 0
      • Christian Ehrlicher
        Christian Ehrlicher Lifetime Qt Champion last edited by

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

        Qt has to stay free or it will die.

        1 Reply Last reply Reply Quote 0
        • U
          umod.47 last edited by umod.47

          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 Reply Quote 0
          • Christian Ehrlicher
            Christian Ehrlicher Lifetime Qt Champion last edited by

            @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 has to stay free or it will die.

            U 1 Reply Last reply Reply Quote 3
            • U
              umod.47 @Christian Ehrlicher last edited by

              @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 Reply Quote 0
              • First post
                Last post