我遇到的这个问题时这样的,用QSplitter加载三个QWidget,使之成为三行可任意拖动,其中子窗口A、B不含layout, 子窗口C 含layout. 我发现有了layout之后,setStretchFactor就不对了。不生效。(而且经我的实验,C的位置的放置也有可能会导致结果有时生效有时不生效。)
一:子窗口按A、C、B的排列方式,从上倒下进行排列。这个时候setStrecjFactor生效。
m_pSplitter = new CXESplitter(Qt::Vertical, this);
QSplitter *pLeftSpliter = new QSplitter(Qt::Vertical, m_pSplitter);
t_a = new A(pLeftSpliter);
t_c = new C(pLeftSpliter);
pLeftSpliter->setStretchFactor(0, 6);
pLeftSpliter->setStretchFactor(1, 1);
t_b = new B(m_pSplitter);
m_pSplitter->addWidget(pLeftSpliter);
m_pSplitter->addWidget(t_b);
m_pSplitter->setOpaqueResize(true);
m_pSplitter->setStretchFactor(0, 1);
m_pSplitter->setStretchFactor(1, 3);
这样子就很神奇的生效了,但是如果只是简单的把B C 的加载位置交换,setStrechFactor调整到再大都是C占满整个窗口。
然后就使用了setSizes这种方法,可以应付解决。如下:
二:子窗口按A、B、C的排列方式,从上倒下进行排列。这个时候setSizes生效。
m_pSplitter = new CXESplitter(Qt::Vertical, this);
QSplitter *pLeftSpliter = new QSplitter(Qt::Vertical, m_pSplitter);
t_a = new A(pLeftSpliter);
t_b = new B(pLeftSpliter);
pLeftSpliter->setStretchFactor(0, 1);
pLeftSpliter->setStretchFactor(1, 1);
t_c = new C(m_pSplitter);
m_pSplitter->addWidget(pLeftSpliter);
m_pSplitter->addWidget(t_c);
m_pSplitter->setOpaqueResize(true);
QList<int> t_sizes;
t_sizes.append(500);
t_sizes.append(1);
m_pSplitter->setSizes(t_sizes);
具体我也不知道为什么。再网上还看到一种解决方法,没有测试过,这里记录一下。
https://blog.csdn.net/baidu_33850454/article/details/80845582