2016-12-13 179 views
0

当应用程序启动但尚未建设时(当所有初始小部件正在创建等)时,我添加到我的布局QSplitter,有两个小部件,我想第二个小部件或多或少地占用可用空间的60/70%,而第一小部件占用空间的其余部分(考虑到分隔器大小本身)。Qt:QSplitter,重做大小

所以,在开始的时候,本身显示的玻璃窗前,我尝试更多或更少的重新调整这两个控件那样:

splitter->setOrientation(Qt::Vertical); 
auto sizes = splitter->sizes(); 

int& first_w = sizes.front(); // == 0 
int& second_w = sizes.last(); // == 0 
int diff = form_w * 2.3 - tbl_w; (30% * 2.3 = ~70%) 

second_w += diff; 
first_w -= diff; 

splitter->setSizes(sizes); 

但是,first_wsecond_w包含00,我不不知道是否由于尺寸尚未计算,或者因为窗口小部件尚未显示(窗口不是),并且不可见小部件的尺寸是0

我能做些什么来获得这些小部件的“未来”尺寸? splitter位于QVBoxLayout之内,并且所有者窗口小部件的可用空间或多或少都是窗口的所有垂直空间(窗口上只有拥有QVBoxLayout的窗口部件上方的QTabBar以及一些填充)。

回答

0

按照docs以下应该做正确的事...

splitter->setSizes(QList<int>() << 30 << 70); 

如果QSplitter是垂直的应分摊30%到顶部部件和70%低。

+0

不,它不起作用(我有测试)。该值以像素为单位设置我认为的大小,并且由于它们之间有很多可用空间可供分配,所以这些值完全被'sizeHint'替代。有问题的小部件是一个'QTextEdit',它的内部需要太多的垂直空间。 –

0

方法QSplitter::sizes()只有在显示小部件时才会给出非零大小。我通常会做的以避免这个问题是覆盖QWidget::showEvent(QShowEvent *event)并在那里调用方法QSplitter::setSizes()

+0

没错!我没有想过。但我认为将一个插槽连接到“显示”信号将是一个更好的方法,但是,哦!没有“显示”信号! –