How do I tell QListView to resize to fit?
I have a QListView and have assigned a model and a delegate. I am using it to display images in a horizontal bar as below
On a user event, data is updated in the model. One such event causes the width of the images to be reduced like below(#4).
I emit a dataChanged on the corresponding index and only the concerned widget is repainted. Because of this, there is a gap between #4 and #5 which does not get filled. I am thinking that there must be a way to refresh all visible rows - but am unable to find it.
I tried the following, but they do not work:
@1. viewport()->updateGeometries() 2. viewport()->update() 3. I tried changing the width to see if it refreshes int curWidth = mp_mylistview->width(); this->mp_mylistview->setFixedWidth(curWidth + 1); this->mp_mylistview->setFixedWidth(curWidth);@
Note: The above images are samples for illustration and not the originals. If you need code, I will need to filter out confidential information before posting it.
Are you implying that the gap between row 4 and 5 should not be there?
What about when you iconify and re-show the window, does that gap go away?
I think each column is normally set to the same width, so I'm not sure what the problem is...
ps. you might want to look at newer tech, like QML for easier ways to display this :)
@Thomas Yes. I need the elements to the right to shift left to occupy the space( and a new one show up if space is available). No, minimizing and restoring does not remove the gap, but if I close the widget and reopen, it fills up the gap. No, the width of each column is variable.
What role(s) are you updating in your model? Just the DecorationRole, or also the SizeHint role?
@Andre I have a custom delegate with the paint() and sizeHint() methods implemented. I do not have a sizehint role within data. I have the following custom roles:
- IconRole - returns a qpixmap
- WidthRole - returns the width of the pixmap
- LabelRole - returns the label to be displayed below the image
The WidthRole returns the updated width.
I had to emit the @layoutChanged()@ signal after the @dataChanged()@ signal.
Ah, that makes sense I guess. Thanks for reporting back!