本文主要是介绍QSplitter中的widget内含有layout,导致setStretchFactor不生效的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我遇到的这个问题时这样的,用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
这篇关于QSplitter中的widget内含有layout,导致setStretchFactor不生效的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!