2010-09-21 82 views
9

我想要實現的是一個構件可以存在於兩種不同的佈局中,在這種情況下,在QHBoxLayout和QVBoxLayout中。當一個設備的屏幕方向發生變化時,我正在實現一個在兩個佈局之間動態切換的系統。Qt:兩個不同佈局中的相同構件

目前我創建,讓我們說叫進myWidget和複雜的複合材料部件將其添加成兩種不同的佈局:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

現在想象一下,這兩個佈局是一個「根」佈局中託管,而這個根部佈局可以調整爲比「高」景觀模式更寬的寬度,並且可以調整爲比「寬大的肖像」模式更高的寬度。

MyWidget僅在添加到第一個佈局中才能正確顯示,當佈局切換時,它將顯示所有錯誤或根本不顯示。

我不知道我在這裏是否有任何意義,但這是我的問題。也許在調用開關事件時,所有子窗口小部件和佈局都應調整大小,所以它總是看起來不錯。唯一的問題是我不知道如何。

+0

相關問題:http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb 2010-09-21 08:42:29

回答

4

這不是特別容易做到,但是可以的。

首先,我建議您實際創建兩個不同的小部件,一個用於垂直,一個用於水平,並以這種方式管理事情。如果源數據與UI類正確分離,您應該可以做到這一點,而不會有太多的麻煩,但會引起一些內存開銷。

根據需要做的一種方法是完全從一個佈局中選擇remove the widgets,並在需要更改屏幕布局時更改其他佈局,並更改添加到該窗口小部件的佈局。這應該導致相同的小部件以不同的方式繪製。

處理此問題的另一種更復雜的方式(儘管潛在地更高效)可能是write your own layout,並讓它根據方向更改來重新排列小部件。

+1

我決定寫的方法時的方位變化,即增加了(之後去除),其被自動調用小部件再次進入佈局。 – Gerstmann 2010-09-23 08:13:44

12

這不是一個更改佈局的通用解決方案,而是一個簡單的解決方案:只需更改boxlayout的方向即可。

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again 
相關問題