QT布局管理(1)-分割窗口类QSplitter,可用鼠标任意拖动控件的大小
QSplitter继承自QFrame,但是无法在ui设计师界面直接拖出来,只能用代码来写。
但是我个人喜欢用设计师来拖放控件,所见即所得,不喜欢用代码来写界面,那么该怎么用设计师界面来设计分割器窗口呢?
我找了一个笨方法,原理步骤是这样的:
1、在打算用QSplitter的地方,先用任意一个容器类控件(QFrame、QWidget、QGroupBox等都可以)在ui中把地方占下;
2、把打算要显示在QSplitter中的各个控件都在这个临时容器控件中画好;
3、把这个临时容器放在一个layout(水平、垂直、网格均可)布局中。
4、在QMainWindow的构造函数中,用QLayout::replaceWidget(QWidget *from, QWidget *to)把临时控件给换成QSplitter
5、把临时容器控件中画好的各个控件都转到QSplitter里面来
图文详解步骤:
1、拖入一个临时容器控件QWidget,为了大家能看清楚,我给他设置了样式表(绿色边框)。然后把想要显示在QSplitter中的控件都画在临时容器QWidget里面,这里我画了3个控件:日历、编辑器、groupBox。
2、除了临时容器之外,还画了个TabWidget,然后给整个窗口设置了网格布局,如上图红色箭头所示。
3、添加代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSplitter * mainSplitter = new QSplitter(Qt::Horizontal);//新建水平分割器
// mainSplitter->resize(600,300);//如果把分割器放置在layout中,那么就无需设置size
QString style = QString("QSplitter::handle { background-color: rgb(179, 179, 179); }") //分割线的颜色
+ QString("QSplitter {border: 2px solid green}");
mainSplitter->setStyleSheet(style);
mainSplitter->setHandleWidth(5);//分割线的宽度
mainSplitter->setChildrenCollapsible(false);//不允许把分割出的子窗口拖小到0,最小值被限定为sizeHint或maxSize/minSize
mainSplitter->addWidget(ui->calendarWidget);//把ui中拖出的各个控件拿走,放到分割器里面
mainSplitter->addWidget(ui->textEdit);
mainSplitter->addWidget(ui->groupBox);
// mainSplitter->addWidget(new QLabel("QLabel"));//也可以在分割器里面新建控件
this->centralWidget()->layout()->replaceWidget(ui->widget_1, mainSplitter);//把ui中拖出的容器QWidget换成分割器
ui->widget_1->hide();
}
效果如下:
既然QSplitter继承自QFrame,那么他就可以直接作为一个独立窗口显示出来,我们仍然可以在ui中画好它的子控件,然后直接在新建的QSplitter中把画好的子控件拿进来。
上述代码的最后两行是把QSplitter替换进MainWindow的布局中的,我们把这两行注释掉,改为:
mainSplitter->show();
然后运行,结果如下,可以看到,QSplitter作为一个独立窗口显示出来了