QSplitter类是一个控件类,继承于QFQSrame,而QFrame又继承于QWidget类,所以QSplitter实例化后也是显示的控件或者窗口。
QSplitter的主要目的是用于处理多个控件之间的宽度或高度变化。如下QTcreator界面的例子:
控件1和2之间可以上下拉动,控件3和1、2组成的控件又可以左右拉动,这就是QSplitter实现的效果。下面展示一个简单的demo,6个控件的组合显示。
demo代码,直接将下面的代码加入到你的mainwindow的构造函数中即可:
#include <QSplitter>
//未指定父对象,所以为独立弹窗
QSplitter* vSplitter = new QSplitter(Qt::Vertical); //垂直(上下)类型
QSplitter* hSplitter = new QSplitter(Qt::Horizontal,vSplitter);//水平(左右)类型
vSplitter->setFixedSize(1000,500);
QTextEdit* textEdit1 = new QTextEdit(hSplitter);
QTextEdit* textEdit2 = new QTextEdit(hSplitter);
QTextEdit* textEdit3 = new QTextEdit(vSplitter);
QWidget *widget1 = new QWidget();
QWidget *widget2 = new QWidget();
QWidget *widget3 = new QWidget();
QPalette pal;
//设置背景黑色
pal.setColor(QPalette::Background, Qt::darkGray);
widget1->setAutoFillBackground(true);
widget1->setPalette(pal);
widget2->setAutoFillBackground(true);
widget2->setPalette(pal);
widget3->setAutoFillBackground(true);
widget3->setPalette(pal);
hSplitter->addWidget(textEdit1);
hSplitter->addWidget(textEdit2);
hSplitter->addWidget(widget1);
hSplitter->addWidget(widget2);
vSplitter->addWidget(hSplitter);
vSplitter->addWidget(textEdit3);
vSplitter->addWidget(widget3);
textEdit1->setText("Edit1");
textEdit1->setAlignment(Qt::AlignCenter);
textEdit2->setText("Edit2");
textEdit2->setAlignment(Qt::AlignCenter);
textEdit3->setText("Edit3");
textEdit3->setAlignment(Qt::AlignCenter);
vSplitter->setHandleWidth(0);
vSplitter->setOpaqueResize(1);
vSplitter->show();
上述代码使用两个QSplitter实例化实现,用法有点类似于水平、垂直布局。
上述代码中的QSplitter,未指定父对象,所以为独立弹窗,不需要担心会覆盖主窗口中的其他控件。
Qt::Vertical属性的QSplitter,他里面的控件可以上下拉动;Qt::Horizontal属性的,控件可以左右拉动。
下面展示QSplitter的一些其他操作:
1、设置默认宽度、高度比例
hSplitter->setStretchFactor(0,10); //设置默认宽度(高度)比例
hSplitter->setStretchFactor(1,10);
hSplitter->setStretchFactor(2,1);
hSplitter->setStretchFactor(3,1);
2、设置控件过窄不隐藏
默认情况下,拉动分界线,使得一个控件宽度很小后,会自动隐藏该控件
hSplitter->setChildrenCollapsible(0); //过窄不可隐藏
3、设置分界线宽度
默认挺宽的,不好看,所以可以设置的比较窄,就是鼠标拉动的时候定位麻烦点。
hSplitter->setHandleWidth(1); //设置分界线(拖动线)宽度
4、设置分界线不可拉动
vSplitter->handle(2)->setDisabled(1); //禁用分界线(拖动线),不可拖动
5、设置控件最小宽度
有时候不希望拉动分界线使得某个控件宽度或者高度特别小,可直接设置控件的最小宽度、高度。
widget2->setMaximumWidth(50);
widget2->setMinimumWidth(50);
相反,不想被拉的太大,可设置最大值。
扫描二维码关注公众号,回复:
13458400 查看本文章
widget2->setMaximumSize(QSize(300,200));