GridLayout and ScrollArea

  • I have a scrollArea wich contains a list of widgets (progressbar, label,tool button)
    gridl is a gridLayout.

    Is it possible to update widgets position on click event?
    for exemple: switching between lines (line3<--line2, line2<--line3)
    I'm obliged to call @ui->scroll->setLayout(gridl);@ when I make some changes on the GridLayout
    I'm lost please help me.

  • [quote author="fouffa89" date="1365158146"]
    Is it possible to update widgets position on click event?

    What about QScrollArea mouse events methods?

  • I have no idea how to do it but I will search for some example , thanks a lot , your post was helpful.

  • another solution would be to have a method in which you create a new gridLayout, add the existing items to that layout, call scrollArea->layout()->deleteLater(); and after call scrollArea->setLayout(new gridLayout);

  • yes this is my solution for now but I'm searching for the best solution to do it. The problem is how to make some changes without loading all the gridlayout?

  • I don't understand why you need to load whole layout. I tried myself and every change in layout is visible automatically (Qt5.0.2, VS2012). See below at my simple test, it changes layout after 5 seconds in timer event (moves label '3' from position 4 to 1). Please, forgive slummy example, I used box layout instead of grid for simplicity.

    #include <QtWidgets\qapplication.h>
    #include <QtWidgets\qwidget.h>
    #include <QtWidgets\qscrollarea.h>
    #include <QtWidgets\qlabel.h>
    #include <QtWidgets\qboxlayout.h>
    #include <QtCore\qstring.h>

    class MyScrollArea
    : public QScrollArea
    //prepare layout elements
    m_mainLayout = new QVBoxLayout;

    for ( int i = 0; i < 10; ++i )
    QLabel * label( new QLabel( QString::number( i ) ) );
    m_mainLayout->addWidget( label );
    m_labels.push_back( label );

    //set layout container
    QWidget *widget( new QWidget );
    widget->setLayout( m_mainLayout );
    setWidget( widget );

    //start timer
    startTimer( 5000 );

    void timerEvent( QTimerEvent * )
    //change layout
    m_mainLayout->removeWidget( m_labels[ 3 ] );
    m_mainLayout->insertWidget( 0, m_labels[ 3 ] );

    QVBoxLayout m_mainLayout;
    QVector< QLabel
    > m_labels;


    int main( int _argc, char** _argv )
    QApplication app( _argc, _argv );

    MyScrollArea scrollArea;
    scrollArea.setMaximumHeight( 100 );;

    return app.exec();

  • You're right , I never thought that it was as simple as that ,Thanks a lot!

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.