Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Expanding QListView within QScrollArea
QtWS25 Last Chance

Expanding QListView within QScrollArea

Scheduled Pinned Locked Moved Mobile and Embedded
29 Posts 5 Posters 19.9k 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.
  • M Offline
    M Offline
    maleadt
    wrote on last edited by
    #1

    Hi all,

    Developing a Maemo5 application, I am trying to fit a QListView together with some other QWidgets in a QScrollArea. By default, the QListView gets fit to the available space, and when there are more items you can scroll the listview. I would like to disable that, so that if you would want to see more items, you scroll the QScrollArea instead of the QListView.
    I want this because when you scroll the QListView, the other widgets (some buttons above it) remain visible, while when you scroll the QScrollArea you "scroll them away".

    I currently do this by fixing the QListView its height -- _QListView::setFixedHeight(model.rows()*PIXELS_PER_ROW) --, something I would like to avoid as it messes up way to much other things. Are there other ways to accomplish this?

    Thanks!

    1 Reply Last reply
    0
    • I Offline
      I Offline
      infoctopus
      wrote on last edited by
      #2

      bq. I would like to disable that, so that if you would want to see more items, you scroll the QScrollArea instead of the QScrollView.bq.

      Probably you mean "you scroll the QScrollArea instead of the QListView"?

      Qt rulez

      1 Reply Last reply
      0
      • M Offline
        M Offline
        maleadt
        wrote on last edited by
        #3

        Indeed, fixed!

        1 Reply Last reply
        0
        • I Offline
          I Offline
          infoctopus
          wrote on last edited by
          #4

          bq. I currently do this by fixing the QListView its height—QListView::setFixedHeight(_model.rows()*PIXELS_PER_ROW)—, something I would like to avoid as it messes up way to much other things.bq.

          What things messes up?

          bq. Are there other ways to accomplish this?bq.

          Have you considered using some other widget instead of QListView?

          E.g. plain QWidget, QVBoxLayout and "item widgets" added to the layout

          Qt rulez

          1 Reply Last reply
          0
          • M Offline
            M Offline
            maleadt
            wrote on last edited by
            #5

            I didn't like the fact I had to guess the PIXELS_PER_ROW number: when it was too big the QListView could be scrolled beyond the last item, too small and the items got truncated. Also, I plan to use a QTreeView in the same manner, and again I don't really like the fact I'd have to loop the list and calculate the amount of visible items in order to get a properly sized QTreeView. Unless there is no other way to accomplish this off course.

            And I'd like to use a QListView if possible, as I use its other functionality (selecting items, drawing using a delegate, expanding them in case of a QTreeView).

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andre
              wrote on last edited by
              #6

              Did you considder that QItemView is itself a QScrollArea? You could perhaps put your additional widgets inside the item view itself. You might try setIndexWidget(). Not sure if it will work for your case, but it might be worth a try.

              Edit: note that QML's ListView element has nice header and footer delegates that would be perfect for this...

              1 Reply Last reply
              0
              • I Offline
                I Offline
                infoctopus
                wrote on last edited by
                #7

                bq. And I’d like to use a QListView if possible, as I use its other functionality (selecting items, drawing using a delegate, expanding them in case of a QTreeView).bq.

                ok

                bq. Did you considder that QItemView is itself a QScrollArea? You could perhaps put your additional widgets inside the item view itself. You might try setIndexWidget(). Not sure if it will work for your case, but it might be worth a try.bq.

                A good idea indeed.

                However it would be easier to give more relevant idea, if you uploaded a screenshot with that widgets.
                (Maybe QTreeView or QTableView could be of use, this might depend on other widgets that must be around)

                Qt rulez

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  maleadt
                  wrote on last edited by
                  #8

                  I was actually trying to get something similar to Maemo's "Conversations" application, a window which contains two buttons with a messages listview below, which scrolls as I described before.

                  I'm now playing with Andre's idea of adding the widgets to the listview itself, which seems to work out fine (apart from some size issues which I think are solvable)!

                  1 Reply Last reply
                  0
                  • I Offline
                    I Offline
                    infoctopus
                    wrote on last edited by
                    #9

                    As in Maemo Conversations: basically, make a widget that contains your other widgets and put the widget into 1st item

                    Qt rulez

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      maleadt
                      wrote on last edited by
                      #10

                      Works like a charm!

                      One additional question though. When there are no items to be displayed in the listview, I insert a dummy widget in the same manner as the top buttons -- setIndexWidget --. However, I'd like that widget to be centered vertically. Normally I accomplish that by using a VCenter alignment and Expanding vertical size policy, but this does not seem to apply within a QListView.
                      Is there a way to get a single item within the listview to consume all extra available space? This seems like the definition of a MinimumExpanding sizepolicy, strange it doesn't work...

                      1 Reply Last reply
                      0
                      • I Offline
                        I Offline
                        infoctopus
                        wrote on last edited by
                        #11

                        give QWidget::setMinimumHeight()/setMinimumSize() a try

                        Qt rulez

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          maleadt
                          wrote on last edited by
                          #12

                          Forcing the minimum height/size obviously works, I'd just like to do it using Qt's size policy features :)
                          EDIT: this because I'd like to reuse the code for other devices.
                          EDIT 2: also, when forcing the minimum height/size, the line which separates the different items in a QListView keeps on getting drawn where it would be drawn in case of a regular-sized item, completely independent of the actual size of the containing widget. Something seems fishy...

                          1 Reply Last reply
                          0
                          • I Offline
                            I Offline
                            infoctopus
                            wrote on last edited by
                            #13

                            maybe sizeHint()/sizePolicy() of the QListView widget will be also helpful

                            Qt rulez

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              maleadt
                              wrote on last edited by
                              #14

                              I tried that, but alas. Funny thing is, the QListView is already fully expanded: if I add a border-drawing stylesheet, it is clear the listview fills the entire space already. Not so with the containing widget though.
                              !http://imgur.com/kDG8P()!

                              1 Reply Last reply
                              0
                              • I Offline
                                I Offline
                                infoctopus
                                wrote on last edited by
                                #15

                                Are you sure that your model doesn't return 6 for rowCount? ;)

                                A workaround: place "No history or favourites" label into the middle (3rd or 4th) row

                                Qt rulez

                                1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  maleadt
                                  wrote on last edited by
                                  #16

                                  I'm sure! Just tested it once more, it contains only 2 items, just as it should. Would there have been more, it would have been made visible by the style sheet as well.

                                  And adding more items does once more restrict the portability by being based on the amount of items it takes to fill the screen... I still hope to stumble upon a "proper" solution :)

                                  Either way, thanks for the help.

                                  1 Reply Last reply
                                  0
                                  • X Offline
                                    X Offline
                                    xsacha
                                    wrote on last edited by
                                    #17

                                    You have a QScrollArea that contains a QListView and other widgets?

                                    Why not have a QListView that contains the other widgets plus the items you already have in it.
                                    You can use a QListView header for this?

                                    Then you can scroll the QListView and everything scrolls up.

                                    Edit: This is what Andre said before.

                                    • Sacha
                                    1 Reply Last reply
                                    0
                                    • M Offline
                                      M Offline
                                      maleadt
                                      wrote on last edited by
                                      #18

                                      That's what I'm doing now indeed. It works, apart from (1) the items not expanding properly despite the QSizePolicy, and (2) the item separating line being drawn where a regular-sized item would have ended instead of where the item actually ends (enforced by setting the widget's minimum size).

                                      1 Reply Last reply
                                      0
                                      • M Offline
                                        M Offline
                                        maleadt
                                        wrote on last edited by
                                        #19

                                        Sorry for the multitude of posts, but I've created a minimal testcase, and I don't think I'm doing anything wrong. Should I file a bug?

                                        This is the test window, which clearly displays the issues I'm talking about:
                                        @class Testcase : public QMainWindow
                                        {
                                        Q_OBJECT
                                        public:
                                        Testcase()
                                        {
                                        // View
                                        QListView* tView = new QListView();
                                        setCentralWidget(tView);
                                        tView->setEditTriggers(QAbstractItemView::NoEditTriggers);
                                        tView->setSelectionBehavior(QAbstractItemView::SelectRows);
                                        tView->setSelectionMode(QAbstractItemView::SingleSelection);

                                            // Model
                                            QStandardItemModel *tModel = new QStandardItemModel(0, 1);
                                            tView->setModel(tModel);
                                            populateModel(tModel, tView);
                                        }
                                        

                                        private:
                                        void populateModel(QStandardItemModel iModel, QListView iView)
                                        {
                                        // Add a regular text item
                                        QStandardItem *tItem = new QStandardItem("Item containing text");
                                        iModel->appendRow(tItem);

                                            // Add a regular widget
                                            QLabel *tLabelRegular = new QLabel("Item containing a label");
                                            iModel->appendRow(new QStandardItem());
                                            iView->setIndexWidget(iModel->index(1, 0), tLabelRegular);
                                            
                                            // Add an expanding widget (using a size policy)
                                            QLabel *tLabelExpanding = new QLabel("Item containing a label with expanding size policy");
                                            tLabelExpanding->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
                                            iModel->appendRow(new QStandardItem());
                                            iView->setIndexWidget(iModel->index(2, 0), tLabelExpanding);
                                            
                                            // Add an expanding widget (using an enforced size)
                                            QLabel *tLabelExpandingForcibly = new QLabel("Item containing a label with enforced minimum height");
                                            iModel->appendRow(new QStandardItem());
                                            tLabelExpandingForcibly->setMinimumHeight(100);
                                            iView->setIndexWidget(iModel->index(3, 0), tLabelExpandingForcibly);
                                        }
                                        

                                        };@

                                        Compiling and launching this window, I get to see:
                                        !http://imgur.com/mNmhj.png(Screenshot of the testcase window.)!

                                        The issues with this testcase being:

                                        • QSizePolicy having no effect on a item, despite there being some space left and the parent QListView being fully expanded to occupy all space in the window (see below).
                                        • When forcing the size of the widget as a temporary work-around, the line which separates the listview items gets drawn at the place where a regularly-sized item would have ended, which is wrong.

                                        To illustrate the first issue a bit better, I've taken an additional screenshot with borders on the listview and its children enabled:
                                        !http://imgur.com/Dr3bd.png(Screenshot of the testcase window, with illustrative borders.)!
                                        This clearly shows that the QListView is fully expanded within the window (no additional QSizePolicy needed, and it doesn't have any effect either), and that there is free space left which should get filled by the third item (the one with an expanding size policy).

                                        1 Reply Last reply
                                        0
                                        • I Offline
                                          I Offline
                                          infoctopus
                                          wrote on last edited by
                                          #20

                                          maleadt,

                                          could you upload a .deb file and/or your project that contains minimal code for reproducing the issue. I could run it on my n900

                                          Qt rulez

                                          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