QTabWidget size depending on current Tab
Asked Answered
I

3

6

I've a QTabWidget, which contains widgets of different heights (their widths are fixed), however, the default implementation ofQTabWidget selects the biggest widget's height as own height.

What I would like to know if there's a (possible fast) way to change the size of QTabWidget depending on its current tab, to save space when smaller tabs are shown.

Intellect answered 18/3, 2015 at 17:35 Comment(1)
The QTabWidget won't select the biggest widget's height as its own height unless you use layout on the QTabWidget. Therefore, if you want to change the size of QTabWidget manually, remove the layout and call QTabWidget::resize according to the currentChanged signal.Epiphenomenon
A
13

You can set the size policy of the widget that is displayed to QSizePolicy::Preferred and the other ones to QSizePolicy::Ignored. After that call adjustSize to update the sizes. For example you can connect the currentChanged signal of the QTabWidget to a slot :

connect(ui->tabWidget,SIGNAL(currentChanged(int)),this, SLOT(updateSizes(int)));

And set size policies and adjust sizes accordingly in the slot :

void MainWindow::updateSizes(int index)
{
    for(int i=0;i<ui->tabWidget->count();i++)
        if(i!=index)
            ui->tabWidget->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

    ui->tabWidget->widget(index)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    ui->tabWidget->widget(index)->resize(ui->tabWidget->widget(index)->minimumSizeHint());
    ui->tabWidget->widget(index)->adjustSize();
    resize(minimumSizeHint());
    adjustSize();
}
Ascender answered 19/3, 2015 at 6:23 Comment(2)
It works like a charm! Even though, I want to know why the adjustSize calls are neccesary. I've commented both of them and your solution does still work fine.Intellect
@Peregring-lk : the last two lines resize the main window itself. You might want to avoid it, depending on your application. For example, if you set the rest of the widgets to expand into the space just made available, it's not so nice if the window resizes itself instead.Nucleon
P
1

OK so this question was already has an accepted answer, but I decided to share my solution, which works remarkably well. It is a small code snippet based on Nejat's answer, and it will work for QTabWidget and QStackedWidget.

template <typename T>
void pack(T *stacked)
{
    for(int i=0; i<stacked->count(); i++) {
        stacked->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    }
    QWidget *widget=stacked->currentWidget();
    widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    widget->resize(widget->minimumSizeHint());
    widget->adjustSize();
    stacked->resize(stacked->minimumSizeHint());
    stacked->adjustSize();
}

NOTE: I used Minimum instead of Preferred to make it take up as small size as possible. Also, this solution expects the currently selected widget to already be set.

Patel answered 31/12, 2016 at 8:31 Comment(0)
T
0
void adjust_minimum_size(QTabWidget* pages)
{
    for (int i = 0; i < pages->count(); i++) {
        pages->widget(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    }
    pages->currentWidget()->resize(1, 1);
    pages->currentWidget()->adjustSize();
    pages->resize(1, 1);
    pages->adjustSize();
    pages->window()->resize(1, 1);
    pages->window()->adjustSize();
    pages->currentWidget()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    pages->currentWidget()->resize(pages->currentWidget()->minimumSizeHint());
    pages->currentWidget()->adjustSize();
    pages->resize(pages->minimumSizeHint());
    pages->adjustSize();
    pages->window()->resize(pages->window()->minimumSizeHint());
    pages->window()->adjustSize();
}
Tender answered 25/8, 2023 at 12:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.