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. Shrinking for QDialog with QStackedWidget in it is not working
Forum Updated to NodeBB v4.3 + New Features

Shrinking for QDialog with QStackedWidget in it is not working

Scheduled Pinned Locked Moved Solved General and Desktop
6 Posts 2 Posters 453 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.
  • Kelly RyanK Offline
    Kelly RyanK Offline
    Kelly Ryan
    wrote on last edited by Kelly Ryan
    #1

    This is my simple dialog without QStackedWidget:
    bb4f390a-7edd-4bc5-a023-5f7cfa3d6507-image.png

    MyDialog::MyDialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MyDialog)
    {
        ui->setupUi(this);
    
        ShowFrame(false);
    
        connect(ui->checkBox, &QCheckBox::toggled, this, [this](bool checked) {
            ShowFrame(checked);
        });
    }
    
    void MyDialog::ShowFrame(bool isHidden)
    {
        ui->frame->setVisible(isHidden);
        adjustSize();
    }
    

    And it works fine. Whenever I press the checkbox the dialog grows/shrinks.
    ab39f5be-de03-4878-9a7e-4e6228425f21-image.png
    42664962-9e3d-40ce-a111-d2f979f45af4-image.png

    But after I add QStackedWidget in QDialog, shrinking is not working anymore.

    1. Starts like this:
      0ca18181-6ec1-4a33-a417-132ffa7e31b2-image.png
    2. Then grows after pressing the checkbox:
      bd279ecd-c0bf-4fd5-9de3-7ff9436dca88-image.png
    3. And never shrinks back:
      66710006-1749-4976-804f-b76e598b3407-image.png

    Here's the updated dialog with QStackedWidget:
    62976490-6ce2-48f3-9190-6dacac91b289-image.png

    MyDialogWithStackedWidget::MyDialogWithStackedWidget(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::MyDialogWithStackedWidget)
    {
        ui->setupUi(this);
    
        ShowFrame(false);
    
        connect(ui->checkBox, &QCheckBox::toggled, this, [this](bool checked) {
            ShowFrame(checked);
        });
    }
    
    void MyDialogWithStackedWidget::ShowFrame(bool isShown)
    {
        ui->frame->setVisible(isShown);
        ui->stackedWidget->adjustSize();
        adjustSize();
    }
    

    What am I missing?

    1 Reply Last reply
    0
    • JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by
      #2

      @Kelly-Ryan said in Shrinking for QDialog with QStackedWidget in it is not working:

      void MyDialog::ShowFrame(bool isHidden)
      {
      ui->frame->setVisible(isHidden);
      adjustSize();
      }

      https://stackoverflow.com/questions/14480696/resize-qstackedwidget-to-the-page-which-is-opened

      1 Reply Last reply
      0
      • Kelly RyanK Offline
        Kelly RyanK Offline
        Kelly Ryan
        wrote on last edited by Kelly Ryan
        #3

        I made ResizableStackedWidget:

        ResizableStackedWidget::ResizableStackedWidget(QWidget *parent) : QStackedWidget(parent)
        {
        	connect(this, &ResizableStackedWidget::currentChanged, this, [this](int index) {
        		QWidget* pWidget = widget(index);
        		Q_ASSERT(pWidget);
        		pWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        		pWidget->adjustSize();
        		adjustSize();
        	});
        }
        
        int ResizableStackedWidget::addWidget(QWidget* pWidget)
        {
           pWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
           return QStackedWidget::addWidget(pWidget);
        }
        

        And promoted my old QStackedWidget to this new one.

        On dialog creation ResizableStackedWidget::addWidget is called with page and page_2 widgets.
        Also currentChanged is triggered with index = 0.
        So at the end we have:
        page = Expanding, Expanding
        page_2 = Ignored, Ignored
        It doesn't help me. My QDialog is still not shrinking after the frame is hidden.

        I've read about the resizable stacked widget and it doesn't seem to be what I want. It's resized whenever you change the pages of QStackedWidget.
        My issue is that after some widget is hidden the whole dialog is not resized to fit minimum space. It doesn't even get Resize event. And it's not about changing pages. I don't even change them, I'm always on 1st page. The problem is only about QDialog resizing.

        Perhaps, I've missed something, sorry.

        1 Reply Last reply
        0
        • Kelly RyanK Offline
          Kelly RyanK Offline
          Kelly Ryan
          wrote on last edited by Kelly Ryan
          #4
          "MyDialog" 	=	 QEvent::Resize // <-- here it grows before showing the frame
          "frame" 	=	 QEvent::Move
          "frame" 	=	 QEvent::Resize
          "frame" 	=	 QEvent::Show
          "frame" 	=	 QEvent::ShowToParent
          "MyDialog" 	=	 QEvent::UpdateRequest
          "MyDialog" 	=	 QEvent::Paint
          "frame" 	=	 QEvent::Paint
          "MyDialog" 	=	 QEvent::LayoutRequest
          "frame" 	=	 QEvent::UpdateLater
          "MyDialog" 	=	 QEvent::UpdateRequest
          "MyDialog" 	=	 QEvent::Paint
          "frame" 	=	 QEvent::Paint
          "MyDialog" 	=	 QEvent::UpdateRequest
          "MyDialog" 	=	 QEvent::Paint
          "MyDialog" 	=	 QEvent::UpdateRequest
          "frame" 	=	 QEvent::Hide
          "frame" 	=	 QEvent::HideToParent
          "MyDialog" 	=	 QEvent::Resize  // here it shrinks after the frame is hidden
          
          "MyDialogWithStackedWidget" 	=	 QEvent::Resize // <-- grows before showing the frame
          "frame" 			=	 QEvent::Move
          "frame" 			=	 QEvent::Resize
          "frame" 			=	 QEvent::Show
          "frame" 			=	 QEvent::ShowToParent
          "MyDialogWithStackedWidget" 	=	 QEvent::UpdateRequest
          "MyDialogWithStackedWidget" 	=	 QEvent::Paint
          "stackedWidget" 		=	 QEvent::Paint
          "frame" 			=	 QEvent::Paint
          "stackedWidget" 		=	 QEvent::LayoutRequest
          "MyDialogWithStackedWidget" 	=	 QEvent::LayoutRequest
          "frame" 			=	 QEvent::UpdateLater
          "MyDialogWithStackedWidget" 	=	 QEvent::UpdateRequest
          "MyDialogWithStackedWidget" 	=	 QEvent::Paint
          "stackedWidget" 		=	 QEvent::Paint
          "frame" 			=	 QEvent::Paint
          "MyDialogWithStackedWidget" 	=	 QEvent::UpdateRequest
          "MyDialogWithStackedWidget" 	=	 QEvent::Paint
          "stackedWidget" 		=	 QEvent::Paint
          "MyDialogWithStackedWidget" 	=	 QEvent::UpdateRequest
          "frame" 			=	 QEvent::Hide
          "frame" 			=	 QEvent::HideToParent
          "stackedWidget" 		=	 QEvent::Resize // <-- only the stacked widget gets resize event and properly shrinks
          "MyDialogWithStackedWidget" 	=	 QEvent::UpdateRequest
          "MyDialogWithStackedWidget" 	=	 QEvent::Paint
          // the dialog never shrinks after the frame is hidden (never gets resize event)
          
          1 Reply Last reply
          0
          • Kelly RyanK Offline
            Kelly RyanK Offline
            Kelly Ryan
            wrote on last edited by
            #5

            MyDialog was getting the resize event after its contents were changed.
            In MyDialogWithStackedWidget the stacked widget now gets that resize event after its contents are changed and it feels like it just doesn't propagate it to its parent, no?

            1 Reply Last reply
            0
            • Kelly RyanK Offline
              Kelly RyanK Offline
              Kelly Ryan
              wrote on last edited by Kelly Ryan
              #6

              Okay, I managed to make it work like this:

              void MyDialogWithStackedWidget::ShowFrame(bool isShown)
              {
              	ui->frame->setVisible(isShown);
              	ui->stackedWidget->currentWidget()->adjustSize();
              	ui->stackedWidget->adjustSize();
              	adjustSize();
              }
              

              And setting size policies for current active page (stackedWidget->currentWidget), stackWidget and dialog itself to Fixed/Fixed.

              Perhaps, that's what @JoeCFD meant in the first place and I just didn't get it.

              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