2009-08-25 29 views
10

我試圖創建一個標準的兩列表單,其中第一列是文本標籤(QLabel),第二列是交互式小部件,通常是文本字段(QLineEdit)。我們決定在QGroupBox之內放置共享共同主題的表單行,因此與主佈局分開佈局。因此,每個QGroupBox中的表單元素不會與QGroupBox es之外的表單元素水平對齊。在Qt中,如何對齊不同分組框中的表單元素?

如何使組合框和佈局的方式使組合框內外的QLabelQLineEdit彼此(水平)對齊?

謝謝!

回答

4

可以在所有的groupboxes內標籤的最小寬度屬性設置的東西,只是寬度不足以顯示最寬的標籤。這將使不同組框中的所有標籤對齊。

現在,要獲得與其內部對齊的groupboxes之外的標籤:首先,我假設每個label/lineedit對都在其自己的水平佈局中,或者您在網格內有多行。無論哪種情況,您可以將標籤的minimumWidth設置爲與groupbox中的標籤相同的值。最後,調整水平(或網格)佈局上的layoutLeftMargin,layoutRightMargin和layoutSpacing屬性,直到標籤/ lineedit對的右邊和左邊與組框內的邊對齊。

如果您還沒有在Qt Creator或Qt Designer中使用表格編輯器來構建您的用戶界面,我發現它可以讓這項任務變得非常簡單。

我不得不承認,這感覺有點kludgey,但在我構建的簡單測試用例中,它似乎工作正常。另一方面,如果用戶更改字體大小,這看起來可能會中斷。也許有更好的方法?

希望這會有所幫助。

+0

我會給這個鏡頭 - 我會讓你知道它是怎麼回事。 – swongu

+0

我沒有嘗試第二個組件,但我可以告訴你,在頂層組框中設置標籤的最小寬度是神奇的。看到我自己的答案僞代碼。 – swongu

1

我不認爲它可以處理嵌套的水平和垂直佈局。你有沒有考慮過QGridLayout

+0

我需要內部的不同組框表單元素,所以很遺憾,我需要不同的/嵌套佈局。實際上,我已經在使用'QGridLayout'! – swongu

0

使用setGeometry()來對所有列進行強制相同的寬度

+0

這不會破壞佈局策略嗎? – swongu

1

kenrogers提供的解決方案,並在這裏是我用得到它的工作的一些不完整的代碼:

int width = 0 ; 
QDialog* dialog ; 
QList<QGridLayout*> layouts = dialog->findChildren<QGridLayout*>() ; 
QList<QLabel*> labels ; 
foreach (QGridLayout* layout, layouts) 
{ 
    // Loop through each layout and get the label on column 0. 
    QLabel* foundLabel ; 
    labels << foundLabel ; 

    // Get the width. 
    width = qMax(foundLabel->width(), width) ; 
} 

foreach (QLabel* label, labels) 
{ 
    label->setMinimumWidth(width) ; 
} 
相關問題