因為打算全屏顯示一個對話框,而對話框內有幾個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()內修改控件尺寸的方式。