因为打算全屏显示一个对话框,而对话框内有几个QLabel的尺寸要在确定QLabel可用的最大尺寸后,再根据内容调整一次,所以在对话框构造函数内就想确定QLabel的最大尺寸,但因为QWidget::updateGeometry()和QWidget::update()都只能用于可见的控件,所以如何在控件不可见时(构造函数内)就可以确定控件布局的最终效果呢?
//widget为需要强制刷新布局的控件,如对话框等
widget->setAttribute(Qt::WA_DontShowOnScreen);
widget->show();
widget->hide();
widget->setAttribute(Qt::WA_DontShowOnScreen, false);
上述方式即可解决此问题,因为此过程不会显示在界面上,并且执行速度很快,所以对用户来说没有影响。
另外如果是对话框的一级子控件在对话框设置为全屏时,子控件的尺寸也是会立即调整的,但二级子控件以及之后的控件就未必会立即重算尺寸了,比如QTabWidget的子tab控件就不会立即重算。。。
注意上述方式要慎用,可能导致Qt事件派发不正常的情况,最好用在比较确定的流程中。
其实在对话框的显示过程中,当执行到对话框的showEvent()时,对话框内控件的尺寸就都是正确的了,所以在对话框内override showEvent函数也是一种可选方案。但因为我还要再调整一次QLabel尺寸,如果在此时调整会导致对话框在显示到屏幕后,再移动一次QLabel的位置(也和在QLabel周围用到了垂直弹簧verticalSpacer有关),总之因为不想每次对话框显示后都看到控件移动位置,所以没有用在showEvent()内修改控件尺寸的方式。