网上查了很多,比如设置子窗口SizePolicy,都不起作用。
总结就是严格按照下面两点要求使用QSplitter就不会存在setStretchFactor失效的问题。
1.调用QSplitter->addWidget( ),传参必须是QWidget类型,不能是QWidget的派生类,比如QTabWidget,QPushButton等等。
例如:
QSplitter *splitter = new QSplitter(this);
QWidget wgt1 = new QWidget(this);
QWidget wgt2 = new QWidget(this);
QWidget wgt3 = new QWidget(this);
splitter->addWidget(wgt1);
splitter->addWidget(wgt2);
splitter->addWidget(wgt3);
splitter->setStretchFactor(0,1);//有效
splitter->setStretchFactor(1,1);//有效
splitter->setStretchFactor(2,1);//有效
2.如果其中有一个子窗口设置了layout,那么其他子窗口必须也要设置layout
例如:
QSplitter *splitter = new QSplitter(this);
QWidget wgt1 = new QWidget(this);
QHBoxLayout *hLay = new QHBoxLayout(wgt1);
QWidget wgt2 = new QWidget(this);
QWidget wgt3 = new QWidget(this);
splitter->addWidget(wgt1);
splitter->addWidget(wgt2);
splitter->addWidget(wgt3);
splitter->setStretchFactor(0,1);//无效
splitter->setStretchFactor(1,1);//无效
splitter->setStretchFactor(2,1);//无效
按上面的代码执行setStretchFactor是无效的。
应该改成如下:
QSplitter *splitter = new QSplitter(this);
QWidget wgt1 = new QWidget(this);
QHBoxLayout *hLay = new QHBoxLayout(wgt1);
QWidget wgt2 = new QWidget(this);
QVBoxLayout *vLay = new QHBoxLayout(wgt2);//视情况选择layout类型
QWidget wgt3 = new QWidget(this);
QGridBoxLayout *gLay = new QHBoxLayout(wgt3);//视情况选择layout类型
splitter->addWidget(wgt1);
splitter->addWidget(wgt2);
splitter->addWidget(wgt3);
splitter->setStretchFactor(0,1);//有效
splitter->setStretchFactor(1,1);//有效
splitter->setStretchFactor(2,1);//有效
ps:如果想用QTabWidget之类的派生类怎么办?直接创建添加到底板wgt1,wgt2,wgt3的布局中即可。