Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QTabWidget size depending on current Tab

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.

like image 743
Peregring-lk Avatar asked Mar 18 '15 17:03

Peregring-lk


2 Answers

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();
}
like image 156
Nejat Avatar answered Oct 20 '22 23:10

Nejat


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.

like image 34
Lennart Rolland Avatar answered Oct 21 '22 01:10

Lennart Rolland