2012-02-06 46 views
3

我試圖創建一個可停靠的工具欄(類似於你在Photoshop中使用的),將持有按鈕的2×(n)的網格。我的想法是使用QGridLayout父對一個空的QWidget,它被添加到QDockWidget,並添加按鈕到QGridLayout。這似乎工作,除了對齊。QDockWidget與QGridLayout - 插件的佈局中不對齊頂端

我設置的按鈕對齊......

myLayout->addWidget(button1,0,0,1,1,Qt::AlignTop); 
myLayout->addWidget(button2,0,1,1,1,Qt::AlignTop); 
myLayout->addWidget(button3,1,0,1,1,Qt::AlignTop); 
myLayout->addWidget(button4,1,1,1,1,Qt::AlignTop); 

...但是網格擴展到QDockWidget的整個高度,如下所示: enter image description here

的按鈕也在水平擴展,以填充整個空間。我想我可以限制水平重新調整它的大小(如果可能的話)。

有我俯瞰的文檔控制GridLayout的更好一點,以限制它填充父窗口部件的整個寬度/高度的功能?作爲一個側面問題,是否有辦法阻止QDOckWidget按照某個方向重新調整大小?

回答

2

使用QVBoxLayout在其中添加第一您的QGridLayout然後添加這樣的片段:

my_vboxlayout->addLayout(my_gridlayout); 
my_vboxlayout->addStretch(1); 

或者你可以告訴你QGridLayout的最後一行應該擴展到最大尺寸,這將推動按鈕。
在你的情況將是:

mygridlayout->setRowStretch(2, 1); // give 3rd row maximum space 

文檔的鏈接爲:
QBoxLayout
QGridLayout

+0

剛試過你的第二個選項 - 設置第二排(或任何我最後一排將是),完美的作品。謝謝! – giraffee 2012-02-07 02:31:05

4

the documentation

QGridLayout 需要提供空間給它(由其父佈局 或由parentWidget()),將其劃分成的行和列,和 使每個插件它管理到正確的單元格。

列和行的行爲相同;我們將討論列,但 有行的等效函數。

每列都有一個最小寬度和一個拉伸因子。最小值 寬度是使用setColumnMinimumWidth()和該列中每個小部件的最小寬度設置的最大值。使用setColumnStretch()設置的彈力系數爲 ,並確定該列可用的空間大小,並超過其必要的最小值。

所以最簡單的方法是使用固定尺寸的可停靠小部件QWidget::setFixedSize。在一般情況下,我不會推薦它(管理佈局),但它是最適合你的情況有以下原因:

  • 所有按鈕具有相同的大小,所以你知道大致取決於該工具欄的大小按鈕數量。
  • 您不需要管理佈局行爲。
  • 你可以用兩種尺寸去做,或兩者

例如,添加一個按鈕時

void addButton(QWidget* w,QGridLayout* wl, QButton* button, posParams...){ 
     // w is the widget inside the QDockWidget (edit) 
     //wl is w layout 
     //break the constraints, the widget can be resized 
     w->setFixedSize(QSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX)); 
     // only line to change if you want to hide, remove widget 
     wl->addWidget(button, params); 
     //fit to contents 
     w->adjustSize(); 
     // can be swapped to w->setFixedHeight, setFixedWidth 
     w->setFixedSize(w->size()); 
    } 

嘗試它,驗證,當你停靠的事情不要出差錯和移除插件修改後。你應該注意到,打破約束也打破了 佈局。

通常在QLayout::SizeConstraint,QWidget::minimumSizeHint,QWidget::minimumSize之間有層次結構,您可以在文檔中找到它。

  • QWidget::minimumSize默認情況下未設置。當它超過時,它優先於 QWidget::minimumSizeHint
  • QWidget::minimumSizeHint如果窗口小部件不在佈局中(意味着它可以通過鼠標調整到0),則無效,否則使用佈局定義的窗口。
  • QLayout::SizeConstraint保存它*直接管理的小部件的默認佈局行爲。如果在佈局B中嵌套佈局A,則添加到A的所有窗口小部件都將使用其屬性。另外,如果B中的小工具W定義了其自己的佈局,則此佈局約束是要應用於小工具W的佈局約束。
+0

哇,謝謝你的解釋。所以,如果我的理解正確,我可以設置QWidget :: setFixedSize(基於按鈕的數量,或者動態地按照您的示例,或者一次,如果將有一個常數的按鈕),並將該QWidget添加到我的QDockWidget(處理停靠功能)。如果是這樣,那將是完美的! 至於解除/重新鎖定 - QDockWidget將如何反應?我確信我可以自己測試這個,只是好奇。我假設在對接時,尺寸擴大到整個窗口 - 將取消鎖定保持固定尺寸? – giraffee 2012-02-07 00:56:57

+0

你是對的,你需要修復QDockWidget中的部件大小。我更新我的答案。如果QdockWidget風格是浮動的或不是浮動的,如果它在一個選項卡等等,你需要看看它如何改變這些屬性,並使用上面的3條規則來調整它的行爲。 – UmNyobe 2012-02-07 10:19:31

0

插入垂直隔離件以下。
enter image description here