2013-02-20 136 views
11

基本上我有一個QGridLayout,其中包含一些小部件。重要的是2個標籤,我用它來將圖像繪製到屏幕上。那麼,如果用戶想要,他可以改變傳入圖像的分辨率,從而迫使標籤重新調整大小。Qt佈局,在部件大小更改後調整到最小值

我們假設標籤的初始尺寸爲320x240。用戶將VideoMode更改爲640x480,標籤和整個GUI完美調整大小。但是,當用戶切換回320x240時,標籤會縮小,但佈局/窗口不會。

我玩過sizePoliciessizeHintsresize(0,0),但沒有什麼訣竅。有人能幫助我嗎?

這裏一些截圖,以澄清問題:

Here, everything is okay still, 640 x 480 resizes perfectly but here, the layout is too big.

回答

21

您需要設置佈局的規模約束持有所有小部件爲「SetFixedSize」。儘管這個名稱聽起來不像它會起作用,但它確保您的佈局只會使用它所需的空間。你不會像第二次截圖時那樣出現問題。

例子:

mainLayout.setSizeConstraint(QLayout::SetFixedSize); 
+2

謝謝!這爲我節省了幾個小時,搜索和調試由這個可怕的命名造成的。爲什麼SetFixedSize意味着「自動調整大小爲最小大小」,這在語義上不是固定大小,因爲最小大小取決於小部件內容的大小(可能爲動態)?有沒有解釋這個? – hna 2014-08-15 18:45:27

+0

這個名字沒有什麼意義,而且自從我和Qt一起工作了一段時間,所以我不記得我是如何發現這一點的。但是這個問題困擾了我一段時間。很高興它幫助你 – user929404 2014-08-17 16:38:17

+0

這似乎適用於除QScrollArea小部件以外的所有內容。你知道這個解決方案嗎? – Assimilater 2015-05-15 16:29:51

1

您需要存儲您的小部件的父窗口的原始尺寸應用任何更改佈局前,當用戶將其還原切換回原來的。

請注意,您需要與控件父窗口大小,而不是控件父大小的工作。

在你的widget

應用佈局更改之前:

minimumWindowSize = this->window().size(); 

當你完成重組的小部件緊湊的尺寸

this->window().resize(minimumWindowSize); 
+0

謝謝你,我會在幾分鐘內嘗試。事實是,有許多不同的分辨率組合,從320x240到1280x1024。這將最多需要10個尺寸配置。有沒有辦法Qt自動執行此操作? – Hafnernuss 2013-02-21 07:45:50

+0

我沒有對它進行測試,但是您可以嘗試只存儲最小大小(或者甚至提供空值大小)。如果我是正確的QT應該自動增加窗口大小到最小值來顯示所有包含的小部件 – Pierluigi 2013-02-21 13:22:45

1

所以這正是我在萬畝項目正在做。 解析度os無關緊要。我只需要有一個用於渲染視頻的小部件,或者您的案例中的圖像。

void MainWindow::resizeEvent(QResizeEvent* event) 
{ 
    QMainWindow::resizeEvent(event); 
    if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){ 
    renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height()); 
    resizeFilter(); 

} 
} 
5
當你願意讓你的物件的尺寸固定在任何時候都

QLayout :: setSizeConstraint(QLayout :: SetFixedSize)解決好這個問題 - 那就是,如果你想它總是被固定在其「打包「的大小(這可能會隨着子部件更改大小而變化)。這就是「固定」在那裏的意思:「固定」到正確的尺寸,即使後者不同。 (按照Qt的說法,我稱之爲「打包」的大小就是widget的大小提示。)

但是在某些情況下,約束可能太強大了。特別是,如果您將其應用於頂層窗口,則用戶將無法自由調整窗口大小。如果你不喜歡那樣,你可以在每次需要時立即執行「set size to sizeHint」操作,而不是將其強加給無情的約束。要做到這一點的方法是調用QWidget :: adjustSize()。

http://doc.qt.io/qt-5/qwidget.html#adjustSize

需要注意的是,如果他們的孩子正在改變大小不是頂級窗口,然後adjustSize()容器必須在容器和其父母遞歸調用。 (在我的情況下,我必須這樣做,無論如何,我也嘗試過大小​​限制方案,並且發現僅在最高級別上應用約束可以成功壓縮所有級別,但我對Qt沒有足夠的瞭解來進行有效評論在這些意見,所以我只是分享他們)。