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. Can't set ScrollBar in QScrollArea
QtWS25 Last Chance

Can't set ScrollBar in QScrollArea

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 3.6k 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.
  • L Offline
    L Offline
    lowee
    wrote on last edited by
    #1

    Hello everybody,

    I'm trying to create a scrollbar in a QScrollArea widget but I can't move the scrollbar. For more information, I'm trying to create a scrollbar as needed : when the numbers of widgets can't be displayed (with their initial size) in the QScrollArea (this is in function of TX_DISPLAY_NUMBER value...)

    There is the code I tried to make:
    My .h file
    @#define TX_DISPLAY_NUMBER 30
    #include <QScrollArea>
    #include <QLineEdit>
    #include <QSpinBox>
    #include <QCheckBox>

    class TxPage : public QWidget
    {
    Q_OBJECT
    QScrollArea *txDisplayArea;

    QLineEdit *tx_Label[TX_DISPLAY_NUMBER];
    QLineEdit *tx_Channel[TX_DISPLAY_NUMBER];
    QSpinBox  *tx_SDI[TX_DISPLAY_NUMBER];
    QLineEdit *tx_Data[TX_DISPLAY_NUMBER];
    QSpinBox  *tx_SSM[TX_DISPLAY_NUMBER];
    QCheckBox *tx_Parity[TX_DISPLAY_NUMBER];
    QLineEdit *tx_ReceptTime[TX_DISPLAY_NUMBER];
    QLineEdit *tx_Status[TX_DISPLAY_NUMBER];
    

    public:
    TxPage();
    }
    @

    My .cpp file (in constructor)
    @txDisplayArea = new QScrollArea;
    for(int indexStatus = 0; indexStatus < TX_DISPLAY_NUMBER; indexStatus++){
    /* Label instantiating */
    tx_Label[indexStatus] = new QLineEdit(txDisplayArea);
    tx_Label[indexStatus]->setEnabled(false);
    tx_Label[indexStatus]->setMaxLength(4);
    tx_Label[indexStatus]->setFixedSize(50,20);

        /* Channel instantiating */
        tx_Channel[indexStatus] = new QLineEdit(txDisplayArea);
        tx_Channel[indexStatus]->setEnabled(false);
        tx_Channel[indexStatus]->setFixedSize(50,20);
        tx_Channel[indexStatus]->setMaxLength(2);
    
        etc.
    

    }

    QGridLayout *tx_ScrollAreaLayout = new QGridLayout;

    /* Loop for Tx Display Area Layout */
    

    for(int indexLayout = 0; indexLayout < TX_DISPLAY_NUMBER; indexLayout++){
    tx_ScrollAreaLayout->addWidget(tx_Label[indexLayout] , indexLayout+1 , 0, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_Channel[indexLayout] , indexLayout+1 , 1, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_SDI[indexLayout] , indexLayout+1 , 2, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_Data[indexLayout] , indexLayout+1 , 3, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_SSM[indexLayout] , indexLayout+1 , 4, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_Parity[indexLayout] , indexLayout+1 , 5, Qt::AlignLeft);
    tx_ScrollAreaLayout->addWidget(tx_Status[indexLayout] , indexLayout+1 , 6, Qt::AlignLeft);
    }
    txDisplayArea->setWidgetResizable(true);
    txDisplayArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    txDisplayArea->setLayout(tx_ScrollAreaLayout);@

    The problem is that all widgets are shown but they overlap each other and ScrollArea (txDisplayArea) isn't resized...

    So, I tried (by replacing) the loop for Tx Display Area with this loop :
    @ for(int indexLayout = 0; indexLayout < TX_DISPLAY_NUMBER; indexLayout++){
    txDisplayArea->setWidget(tx_Label[indexLayout]);
    txDisplayArea->setWidget(tx_Channel[indexLayout]);
    txDisplayArea->setWidget(tx_SDI[indexLayout]);
    txDisplayArea->setWidget(tx_Data[indexLayout]);
    txDisplayArea->setWidget(tx_SSM[indexLayout]);
    txDisplayArea->setWidget(tx_Parity[indexLayout]);
    txDisplayArea->setWidget(tx_Status[indexLayout]);
    }@

    But there is only one widget displayed on top left of the scroll area (i think it's tx_Label QLineEdit or all widgets are stacked...)

    Believe me, I tried to find out the solution on my way and with our best friend : Google... and I didn't find the solution to my problem... So I'll give up, I'm desperate...

    Somebody can help me ?

    We are animals that our brain gives us the feeling that we aren't

    1 Reply Last reply
    0
    • G Offline
      G Offline
      giesbert
      wrote on last edited by
      #2

      The problem is the last block.
      you set a widget, and the replace it again. (setWidget does not add a widget!)

      if you "look at the QScrollArea docs,":http://doc.qt.nokia.com/4.7/qscrollarea.html you find

      bq. A scroll area is used to display the contents of a child widget within a frame.

      I interpret that (never tried it) that you must create one child widget which contains the layout and all the widghets and add that with addWidget. Don't put a layout directly onto the scroll view.

      By the way, it looks like you want to create a table, why don't you use a table view and a delegate for the editing?

      Nokia Certified Qt Specialist.
      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

      1 Reply Last reply
      0
      • L Offline
        L Offline
        lowee
        wrote on last edited by
        #3

        [quote author="Gerolf" date="1322777479"]why don't you use a table view and a delegate for the editing?[/quote]

        Oooh great Gerolf, I've never thought about it !

        Thanks for your answer !

        But for a better explanation, the last block is not implemented, I replace the loop :
        @/* Loop for Tx Display Area Layout */
        for(int indexLayout = 0; indexLayout < TX_DISPLAY_NUMBER; indexLayout++){
        tx_ScrollAreaLayout->addWidget(tx_Label[indexLayout] , indexLayout+1 , 0, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_Channel[indexLayout] , indexLayout+1 , 1, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_SDI[indexLayout] , indexLayout+1 , 2, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_Data[indexLayout] , indexLayout+1 , 3, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_SSM[indexLayout] , indexLayout+1 , 4, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_Parity[indexLayout] , indexLayout+1 , 5, Qt::AlignLeft);
        tx_ScrollAreaLayout->addWidget(tx_Status[indexLayout] , indexLayout+1 , 6, Qt::AlignLeft);
        }@

        by the loop :

        @for(int indexLayout = 0; indexLayout < TX_DISPLAY_NUMBER; indexLayout++){
        txDisplayArea->setWidget(tx_Label[indexLayout]);
        txDisplayArea->setWidget(tx_Channel[indexLayout]);
        txDisplayArea->setWidget(tx_SDI[indexLayout]);
        txDisplayArea->setWidget(tx_Data[indexLayout]);
        txDisplayArea->setWidget(tx_SSM[indexLayout]);
        txDisplayArea->setWidget(tx_Parity[indexLayout]);
        txDisplayArea->setWidget(tx_Status[indexLayout]);
        }@

        but each loop doesn't make what I want : set the scroll bar

        So I'll try with QTableView, I think this is the best way to realize what I want!

        Thanks a lot !

        We are animals that our brain gives us the feeling that we aren't

        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