Qt QStackedWidget 调整大小问题

10

我有一个简单的QStackedWidget,其中包含3个不同的QWidgets。这些QWidget的最小尺寸分别为(350x200)、(200x100)和(450x450)。

问题在于当我调整QStackedWidget的大小时,它的最小尺寸是其中最大的QWidget的尺寸。所以如果我切换到第二个QWidget(具有(200x100)的尺寸),QStackedWidget只会调整到(450x450),因为它是其中最大的QWidget。我希望它可以调整大小以适应当前显示的QWidget,并去除那个最小尺寸。


这个问题已经在这里被问过了,我是在发布后才看到的。链接的问题质量较低,所以我进行了编辑,并投票将此问题关闭为重复。 - UmNyobe
好的,谢谢兄弟。我一直在找,但没有看到这个。 - David Ludwig
那个问题的标题是错误的。即使它出现在搜索结果中,你也很难看到它。 - UmNyobe
4个回答

8

我认为最直接的解决方案是子类化QStackedWidget并重写sizeHint和minimumSizeHint方法,使其返回当前widget的hint而不是所有widget的最大值。例如:

class StackedWidget : public QStackedWidget
{
  QSize sizeHint() const override
  {
    return currentWidget()->sizeHint();
  }

  QSize minimumSizeHint() const override
  {
    return currentWidget()->minimumSizeHint();
  }
};

6
好问题。不幸的是,Qt没有提供自动机制来根据子部件缩小大小(通过自动我指的是您不必做任何事情)。大多数关注点都集中在扩展上(请参见大小策略)。
你有两个选择:
  1. 在创建这些部件的类中使用信号和槽机制。您需要监听信号 void QStackedWidget ::currentChanged ( int index ) 并将堆叠窗口调整为 index 处的窗口大小。编码速度很快。
  2. 装饰 QStackedWidget 并定义大小属性。基本上,sizeHint()minimumSizeHint() 都应该返回当前窗口的大小。 Addwidget(QWidget*) 也需要进行修改。如果您在各处使用堆叠窗口,则此选项很有用。

0

步骤1:重载方法:

void resizeEvent(QResizeEvent*)

步骤2:调用“resize”和“select page”:

QRect rect;
rect.setBottomRight(stackedWidget->geometry().bottomRight());
currentWidget->setGeometry(rect);

只有在QStackedWidget本身不在布局中时才有效。如果它在布局中,则必须通过大小提示、最小大小、大小策略等设置其大小。另一个标记为重复的问题https://dev59.com/r23Xa4cB1Zd3GeqPgJAz的答案更有用。 - Hamish Moffatt

0
一个替代方案是根本不使用堆叠小部件,而是为每个页面制作一个小部件,然后使用setVisible(bool)来显示和隐藏页面。这样,您就可以获得调整大小的行为,而无需制作自定义小部件。

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