调整 QStackedWidget 的大小以适应打开的页面

10
我希望我的 QStackedWidget 能够自适应打开的页面大小。
第一个页面上有很多小部件,但其余页面只有一个按钮。因此它们保持着原本的尺寸,而第一个页面是正常的。
我该如何让我的 QStackedWidget 大小与当前页面相同?
我想这样做的原因是我有三个不同的选项,之后还有其他东西。如果我切换到只有一个按钮和大量空白区域的模式,我不明白为什么它不会自适应调整大小。
3个回答

11

您可以使用这个可调整大小的堆栈窗口部件(Resizable StackedWidget)

在我的实践中,我记得我有一个派生自QStackedWidget的类,重新定义了addWidget方法。在这个方法中,我做了以下操作:

void ResizableStackedWidget::addWidget(QWidget* pWidget)
{
   pWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
   QStackedWidget::addWidget(pWidget);
}

并使用此槽连接到 currentChange(QWidget*) 信号:

void ResizableStackedWidget::onCurrentChanged(int index)
{
   QWidget* pWidget = widget(index);
   Q_ASSERT(pWidget);
   pWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
   pWidget->adjustSize();
   adjustSize();
}

8
// make the stacked widget size to the current page only
for (int i = 0; i < m_ui->stackedWidget->count (); ++i)
{
    // determine the vertical size policy
    QSizePolicy::Policy policy = QSizePolicy::Ignored;
    if (i == m_ui->stackedWidget->currentIndex ())
        policy = QSizePolicy::Expanding;

    // update the size policy
    QWidget* pPage = m_ui->stackedWidget->widget (i);
    pPage->setSizePolicy (policy, policy);
}

谢谢!你每次都这样做吗?只有在创建时吗?我不明白!抱歉。你什么时候做这个?我创建所有的小部件,我添加它们...但我不知道你可以为每个页面设置策略。 - Darkgaze
设置扩展到页面,无法工作... - Darkgaze
每当当前页面更改时,执行此操作。 - cppguy
你需要在 QStackedWidget 上设置一个良好的尺寸策略,似乎在更改页面小部件的大小策略后,我还需要在 QStackedWidget 上调用 adjustSize()。 - Hamish Moffatt
谢谢,这对我有用。每当页面发生变化时,比如在stackedWidget::onCurrentChanged的插槽中,应该添加这个。 - RandomGuy

2

您可以使用垂直布局将页面与单个按钮包装在QFrame中,并在底部添加间隔。


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