2011-07-15 24 views
3

我正在編寫自己的類,它非常類似於工具欄,它將在其內部的水平框佈局對象下包含小部件。最奇怪的Qt佈局「吃肉」問題

我有一個容器類作爲一個容器 我有一個派生類從QPushButton,自定義繪畫(真正顯示在pos 0,0加載的圖像)。

我初始化佈局對象:

this->buttonLayout = new QHBoxLayout(this); 
this->buttonLayout->setContentsMargins(0, 0, 0, 0); 
this->buttonLayout->setSpacing(0); 
this->buttonLayout->setObjectName("buttonsLayout"); 

,然後我開始初始化窗口小部件和「加入」它們放到與此類似的佈局:

// once button is created.. add it... 
this->buttonLayout->addWidget(button); 

最後,創建一個墊片對象來確保我所有的工具欄按鈕都對齊到左側。

QSpacerItem * spacerItem = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); 
this->buttonLayout->addItem(spacerItem); 

我的按鈕類在構造函數中定義了一個「setMinimumSize」,它在調試器下是正確的。它還重新定義了在運行時調用的「hintSize」,並且值是正確的。

我的問題是這樣的。我將3個「按鈕」加載到工具欄上。所有都有可變的大小。 如果佈局上的間距爲0,則前兩個按鈕將精確地截斷9個像素!但第三個按鈕將會正常。 如果佈局間距爲-1按鈕將很好地顯示其可變大小,但它們之間會有一個兩像素空間(我不需要任何空間)。最後,如果佈局間距爲「9」,則一切都會顯示正常。

爲什麼間距「0」弄亂了按鈕佈局導致覆蓋?數字「9」從哪裏來?爲什麼當間距爲「0」時,前兩個按鈕(例如,除最後一個按鈕之外的所有按鈕)正好被截斷9個像素?

我在任何地方都找不到答案。

附加信息:

我已經將範圍縮小到這一點:

對於每一個按鈕類,我加載了一個QImage的。 hintSize返回它的大小,它在調試器下是正確的。返回的大小與photoshop中關於圖像的說明以及圖像的屬性有關的說明有關...

但是,在工具欄上,在佈局之後,總會給出其寬度「 - 9」! !所以右邊的下面的按鈕總是被塗在它上面,隱藏了按鈕左邊的9個高度像素。

如果我手動添加一個「+9」到我的按鈕類中的sizeHint,它完美的工作。

我不明白問題來自哪裏。在佈局和水平間距之間的某處,像素被「偷走」,我不知道這裏發生了什麼。

有沒有人遇到類似的東西?爲什麼我必須從每個按鈕上「預先」偷走9個像素,以便佈局完美?

+0

只是一個猜測,但你有沒有調查什麼frameSize()返回? – James

+0

我會試試看,謝謝。 – JasonGenX

+0

你的按鈕類的郵政編碼,以及什麼平臺。 (Mac OS X與QPushButton派生類有一些愚蠢的間距問題。) –

回答