QTabWidget 大小取决于当前选项卡

问题描述 投票:0回答:3

我有一个

QTabWidget
,其中包含不同高度的小部件(它们的宽度是固定的),但是,
QTabWidget
的默认实现选择最大的小部件的高度作为自己的高度。

我想知道是否有一种(可能快速)的方法可以根据当前选项卡更改

QTabWidget
的大小,以便在显示较小的选项卡时节省空间。

c++ qt tabs size qtabwidget
3个回答
12
投票

您可以将显示的小部件的大小策略设置为

QSizePolicy::Preferred
,将其他小部件设置为
QSizePolicy::Ignored
。之后致电
adjustSize
更新尺寸。例如,您可以将
currentChanged
QTabWidget
信号连接到插槽:

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

并设置尺寸策略并在插槽中相应调整尺寸:

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();
}

1
投票

好吧,这个问题已经有了一个公认的答案,但我决定分享我的解决方案,效果非常好。这是一个基于 Nejat 答案的小代码片段,适用于

QTabWidget
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();
}

注意:我使用“最小”而不是“首选”,以使其占用尽可能小的尺寸。此外,该解决方案期望当前选择的小部件已被设置。


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();
}
© www.soinside.com 2019 - 2024. All rights reserved.