David Ludwig
David Ludwig

Reputation: 1037

Qt QStackedWidget Resizing Issue

I have a simple QStackedWidget with 3 different QWidgets in it. The minimum sizes of the QWidgets are (350x200), (200x100), and (450x450).

So the problem I'm having is when I resize the QStackedWidget, it has a minimum size of the largest QWidget within it. So if I switch to the second QWidget, (which is the QWidget with the size of (200x100)), the QStackedWidget will only size down (450x450) because of the largest QWidget inside of it. I would like it to size down to fit the current QWidget being displayed, and remove that minimum size.

Upvotes: 13

Views: 7098

Answers (4)

Jason Haslam
Jason Haslam

Reputation: 2897

The most straightforward solution is to subclass QStackedWidget and override sizeHint and minimumSizeHint to return the hint for the current widget instead of the maximum of all widgets. For example:

class StackedWidget : public QStackedWidget
{
  QSize sizeHint() const override
  {
    return currentWidget()->sizeHint();
  }

  QSize minimumSizeHint() const override
  {
    return currentWidget()->minimumSizeHint();
  }
};

Upvotes: 11

William Hofsøy
William Hofsøy

Reputation: 13

An alternate solution is to not use stacked widget at all and instead make one Widget for each page and then use the setVisible(bool) to show and hide the pages. That way you get the resizing behavior without having to make custom widgets.

Upvotes: 1

Mr.Angel
Mr.Angel

Reputation: 117

step 1: overload method:

void resizeEvent(QResizeEvent*)

step 2: call 'resize' and 'select page' :

QRect rect;
rect.setBottomRight(stackedWidget->geometry().bottomRight());
currentWidget->setGeometry(rect);

Upvotes: 0

UmNyobe
UmNyobe

Reputation: 22890

Good question. Unfortunately Qt doesnt provide automatic mechanisms for sizing down depending on child widgets (By automatic I mean you don't have to do anything). Most of the focus is on expanding (see the size policies)

You have two options :

  1. Use the signal and slots mechanism in the class which create those widgets. You will need to listen to the signal void QStackedWidget ::currentChanged ( int index ) and resize the stackedwidget to the size of the widget at index. This is quite fast to code.

  2. Decorate QStackedWidget and define the size properties. Basically both sizeHint() and minimumSizeHint() should return the size of the current widget. Addwidget(QWidget*) also need to be modified. Useful if you are using stacked widgets everywhere.

Upvotes: 6

Related Questions