[From Qt Doc: This property holds the recommended minimum size for the widget. If the value of this property is an invalid size, no minimum size is recommended. The default implementation of minimumSizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's minimum size otherwise. Most built-in widgets reimplement minimumSizeHint().] Qt 中的 widget 有 size 和 minimumSize 两个属性,比较好理解的是上面的sizeHint 是作为 size 的参考的,那么 minimumSizeHint 是作为 minimumSize 的参考的。minimumSizeHint() 的默认实现同 sizeHint() 基本一样:在 widget 无 layout 的情况下返回无效值;否则返回 layout 的最小尺寸(minimum size),注意与上面的首选尺寸不同哦!有同学会问 preferred size 和 minimum size 的区别:preferred size 由 layout 的 sizeHint() 函数返回,minimum size 由 layout 的 minimumSize() 函数返回;前者的实现会根据 layout 的种类的变化而变化,比如在 QHBoxLayout 和 QVBoxLayout 中各放置同样的两个 QPushButton,两者的 sizeHint() 返回的值是不一样的,后者是返回能够容纳下所有包含在 layout 内的组件的最小尺寸。Qt 中大多数内置的 widget 都已经重新实现了 minimumSizeHint()。你可以自己写自己的 widget 然后重新实现 sizeHint()、minimumSizeHint() 这些函数来达到自己的布局效果。
[From Qt Doc: QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.] layout 永远也不会把一个 widget 的大小设置到比 minimumSizeHint() 返回的尺寸还小,除非 widget 设置了最小尺寸或者其 sizePolicy 属性设置了 QSizePolicy::Ignore。如果 widget 通过 setMinimumSize() 设置了最小尺寸,那么 minimumSizeHint 的作用就会被忽略掉。我们知道如果在一个 layout 里面添加一些子 widget,然后窗口应用这个 layout 的时候,一般情况下我们是无法缩放到使其中的子 widget 看不见的。如下: 1: QWidget *widget = new QWidget;
2: widget->setMinimumSize(10, 10);
3: QVBoxLayout *layout = new QVBoxLayout;
4: QPushButton *button = new QPushButton("Ggicci");
5: layout->addWidget(button);
6: widget->setLayout(layout);
7: widget->show();
这里同上显示一个含有 QPushButton 的 QWidget,不过在这里设置了其最小尺寸为(10, 10),此时 minimumSizeHint() 将不起作用,也就是我们可以把widget 缩放到(10, 10),不过这是理论上的哦,亲~(在这里你讲看到一个例外),以下就是缩小到了极致:(112,10),同学,是否在思考为什么 width 无法缩小到比 112 更小了。其实这是 widget 和 windows 系统的共同问题,第一 widget 默认有 min,max,close 三个按钮,也就是右上角的最小化、最大化、关闭按钮,这导致了 width 无法继续缩小。其实通过 widget->setWindowFlags(Qt::Window | Qt::WindowTitleHint); 可以把 min, max 按钮给去了,这样的 widget 的 width 就可以比之前更小一点啦,如下右图。
sizePolicy
[From Qt Doc: This property holds the default layout behavior of the widget. If there is a QLayout that manages this widget's children, the size policy specified by that layout is used. If there is no such QLayout, the result of this function is used.] 这个属性保存了该 widget 的默认布局属性,如果它有一个 layout 来布局其子 widgets,那么这个 layout 的 size policy 将被使用;如果该 widget 没有 layout 来布局其子 widgets,那么它的 size policy 将被使用。默认的 policy 是 Preferred/Preferred。QSizePolicy::Policy 枚举值有如下几个: