QTabWidget的大小取决于当前选项卡。

6
我有一个 QTabWidget,其中包含高度不同的小部件(它们的宽度是固定的),然而,QTabWidget 的默认实现选择最大小部件的高度作为自己的高度。
我想知道是否有一种(可能快速的)方法来根据当前选项卡更改 QTabWidget 的大小,以节省显示较小选项卡时的空间。

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tay2510
3个回答

12

您可以将显示的窗口小部件的大小策略设置为QSizePolicy::Preferred,将其他窗口小部件的大小策略设置为QSizePolicy::Ignored。之后调用adjustSize更新大小。例如,您可以将QTabWidgetcurrentChanged信号连接到插槽中:

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
它运行得非常好!尽管如此,我想知道为什么需要adjustSize调用。我已经注释了它们两个,但你的解决方案仍然可以正常工作。 - ABu
@Peregring-lk:最后两行代码调整了主窗口的大小。根据你的应用程序,你可能想要避免这样做。例如,如果你将其余的小部件设置为扩展到刚刚提供的空间中,那么如果窗口自动调整大小,它就不太好看了。 - vsz

1

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

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

注意:我使用最小化而不是首选项来使其尽可能占用较小的空间。此解决方案还期望当前选择的小部件已经设置好。

在我的情况下,使用QSizePolicy::Minimum而不是Preferred并没有改变行为。我必须设置包含QTabWidget的布局的大小为QTabWidget的minimumSizeHint - Burak

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接