QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件窗口大小变化后,便会自动更新界面组件的大小。布局管理器可以自定义,从而达到更加个性化界面布局的效果布局管理器可以相互嵌套,完成所有常用的界面布局QLayout是Qt中布局管理器的抽象基类,如下图所示: 回到顶部1。实例参考 1includetestlayout。h2includeQApplication4includeQLabel5includeQLineEdit6includeQRadioButton7includeQFormLayout8includeQPushButton9intmain(intargc,charargv〔〕)11{12QApplicationa(argc,argv);13TestLayoutw;1415设置标签,并且设置快捷键16QLabelnameLabelnewQLabel(姓名:(N));17QLabelageLabelnewQLabel(年龄:(A));18QLabelemailLabelnewQLabel(邮箱:(E));19QLabelnumLabelnewQLabel(门牌号码:);2021创建三个输入框22QLineEditnameLineEditnewQLineEdit;23QLineEditageLineEditnewQLineEdit;24QLineEditemailLineEditnewQLineEdit;25QLineEditnumLineEditnewQLineEdit;2627设置标签与输入框的伙伴关系28nameLabelsetBuddy(nameLineEdit);29ageLabelsetBuddy(ageLineEdit);30emailLabelsetBuddy(emailLineEdit);31numLabelsetBuddy(numLineEdit);3233表单布局34QFormLayoutheaderLayoutnewQFormLayout;35headerLayoutaddRow(nameLabel,nameLineEdit);36headerLayoutaddRow(ageLabel,ageLineEdit);37headerLayoutaddRow(emailLabel,emailLineEdit);38headerLayoutaddRow(numLabel,numLineEdit);3940单选按钮41QLabelsexLabelnewQLabel(性别:);42QRadioButtonmBtnnewQRadioButton;43QRadioButtonwBtnnewQRadioButton;44mBtnsetText(男);45wBtnsetText(女);4647水平布局QHBoxLayout,H:horizontal水平48QHBoxLayoutsexLayoutnewQHBoxLayout;49sexLayoutaddWidget(sexLabel);50sexLayoutaddWidget(mBtn);51sexLayoutaddWidget(wBtn);525354QSpacerItem为添加空隙的函数,他的四个参数为:空隙区域的宽,空隙区域的高,高的尺寸策略最小到无限大,水平方向的的尺寸策略最小到无限大55QSpacerItem(intw,inth,QSizePolicy::PolicyhPolicyQSizePolicy::Minimum,QSizePolicy::PolicyvPolicyQSizePolicy::Minimum)56QSpacerItemspacernewQSpacerItem(20,10);57QSpacerItemspacerLnewQSpacerItem(50,50);58QSpacerItemspacerRnewQSpacerItem(50,50);5960添加按钮61QPushButtonokBtnnewQPushButton(确定);6263为了让确认按钮窄点,将两个空隙放到确认按钮两旁64QHBoxLayoutQHLayoutOKnewQHBoxLayout;65QHLayoutOKaddItem(spacerL);66QHLayoutOKaddWidget(okBtn);67QHLayoutOKaddItem(spacerR);6869垂直布局QVBoxLayout,V:vertical垂直70QVBoxLayoutmainLayoutnewQVBoxLayout;71mainLayoutaddLayout(headerLayout);addLayout添加布局72mainLayoutaddLayout(sexLayout);73mainLayoutaddItem(spacer);addItem添加空隙74mainLayoutaddWidget(okBtn);addWidget添加部件75mainLayoutaddLayout(QHLayoutOK);7677设置部件与窗体之间的空隙78mainLayoutsetMargin(25);7980设置控件之间的间隙81mainLayoutsetSpacing(10);8283调用加载窗口的布局84w。setLayout(mainLayout);85w。show();86returna。exec();87} 回到顶部 点击领取Qt学习资料视频教程链接 2。QBoxLayout水平垂直布局 QBoxLayout有两个子类:QHBoxLayout(水平)和QVBoxLayout(垂直) 比如垂直布局,表示将垂直方向分为一个个格子,如下图所示: 2。1QVBoxLayout使用(垂直)intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QWidgetw;QVBoxLayoutlayoutnewQVBoxLayout;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);btn1。setMaximumSize(600,360);btn1。setMinimumSize(100,60);btn2。setMaximumSize(600,360);btn2。setMinimumSize(100,60);btn3。setMaximumSize(600,360);btn3。setMinimumSize(100,60);layoutaddWidget(btn1);向布局管理器添加组件,实现自动布局layoutaddWidget(btn2);layoutaddWidget(btn3);w。setLayout(layout);为部件设置布局管理器layoutsetSpacing(10);w。show();returna。exec();}2。2QHBoxLayout使用(水平)intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QWidgetw;QHBoxLayoutlayoutnewQHBoxLayout;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);btn1。setMaximumSize(600,360);btn1。setMinimumSize(100,60);btn2。setMaximumSize(600,360);btn2。setMinimumSize(100,60);btn3。setMaximumSize(600,360);btn3。setMinimumSize(100,60);layoutaddWidget(btn1);向布局管理器添加组件,实现自动布局layoutaddWidget(btn2);layoutaddWidget(btn3);w。setLayout(layout);为部件设置布局管理器layoutsetSpacing(10);w。show();returna。exec();}2。3QBoxLayout相互嵌套 1。1与1。2写了QHBoxLayout(水平)和QVBoxLayout(垂直),但是只是单方面自动布局。 接下来,来使用嵌套,来实现水平垂直自动布局,如下图所示: intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QHBoxLayoutHlayout1newQHBoxLayout;QHBoxLayoutHlayout2newQHBoxLayout;QVBoxLayoutVlayoutnewQVBoxLayout;QWidgetw;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);QPushButtonbtn4(test4,w);btn1。setMaximumSize(600,360);btn1。setMinimumSize(100,60);btn2。setMaximumSize(600,360);btn2。setMinimumSize(100,60);btn3。setMaximumSize(600,360);btn3。setMinimumSize(100,60);btn4。setMaximumSize(600,360);btn4。setMinimumSize(100,60);Hlayout1addWidget(btn1);水平布局:btn1btn2Hlayout1addWidget(btn2);Hlayout1setSpacing(10);Hlayout2addWidget(btn3);水平布局:btn3btn4Hlayout2addWidget(btn4);Hlayout2setSpacing(10);VlayoutaddLayout(Hlayout1);垂直布局:Hlayout1Hlayout2VlayoutaddLayout(Hlayout2);VlayoutsetSpacing(10);w。setLayout(Vlayout);设置布局管理器,由于Vlayout管理着Hlayout1Hlayout2,所以只填写一个即可w。show();returna。exec();} 布局管理器比例系数 默认情况下,组件之间以等比例的方式改变组件大小。 其实用户也可以自定义组件之间比例系数,当窗口放大时,便来更新比例系数。 常用函数:QBoxLayout::setStretch(intindex,intstretch);设置具体组件的拉伸系数index:表示布局管理器里的第几个组件stretch:拉伸系数boolQBoxLayout::setStretchFactor(QWidgetwidget,intstretch);设置部件拉伸系数,如果存在widget这个组件,则设置成功,返回trueboolQBoxLayout::setStretchFactor(QLayoutlayout,intstretch);设置布局拉伸系数,,如果存在layout这个组件,则设置成功,返回true 示例代码如下:intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QHBoxLayoutHlayout1newQHBoxLayout;QHBoxLayoutHlayout2newQHBoxLayout;QVBoxLayoutVlayoutnewQVBoxLayout;QWidgetw;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);QPushButtonbtn4(test4,w);btn1。setMinimumSize(100,60);btn2。setMinimumSize(100,60);btn3。setMinimumSize(100,60);btn4。setMinimumSize(100,60);设置大小策略,Expanding表示组件可扩展btn1。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn2。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn3。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn4。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);Hlayout1addWidget(btn1);水平布局:btn1btn2Hlayout1addWidget(btn2);Hlayout1setSpacing(10);Hlayout2addWidget(btn3);水平布局:btn3btn4Hlayout2addWidget(btn4);Hlayout2setSpacing(10);VlayoutaddLayout(Hlayout1);垂直布局:Hlayout1Hlayout2VlayoutaddLayout(Hlayout2);VlayoutsetStretchFactor(Hlayout1,1);VlayoutsetStretchFactor(Hlayout2,3);VlayoutsetSpacing(10);w。setLayout(Vlayout);设置布局管理器,由于Vlayout管理着Hlayout1Hlayout2,所以只填写一个即可w。show();returna。exec();} 拉伸窗口后: 回到顶部3。QGridLayout网格布局3。1以网格的方式管理界面组件 类似于:嵌套方式来使用QBoxLayout。 常用函数:voidaddWidget(QWidgetwidget,introw,intcolumn,Qt::Alignmentalignment0);rowcolumn:表示将widget这个部件放在网格哪个位置voidaddWidget(QWidgetwidget,intfromRow,intfromColumn,introwSpan,intcolumnSpan,Qt::Alignmentalignment0);formRowformColumn:表示将widget这个部件放在网格哪个位置rowSpan:widget:这个部件占多少行columnSpan:widget:这个部件占多少列voidsetColumnStretch(intcolumn,intstretch);设置列拉伸系数column:设置布局管理器里的第几列,第1列为0voidsetRowStretch(introw,intstretch);设置行拉伸系数row:设置的第几行 示例代码:intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QGridLayoutlayoutnewQGridLayout;QWidgetw;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);QPushButtonbtn4(test4,w);btn1。setMinimumSize(100,60);btn2。setMinimumSize(100,60);btn3。setMinimumSize(100,60);btn4。setMinimumSize(100,60);设置大小策略,Expanding表示组件可扩展btn1。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn2。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn3。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn4。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);layoutaddWidget(btn1,0,0);layoutaddWidget(btn2,0,1);layoutaddWidget(btn3,1,0);layoutaddWidget(btn4,1,1);layoutsetRowStretch(0,1);设置第0行,比例为1layoutsetRowStretch(1,2);设置第1行,比例为2layoutsetColumnStretch(0,1);设置第0列,比例为1layoutsetColumnStretch(1,2);设置第1列,比例为2w。setLayout(layout);设置布局管理器w。show();returna。exec();} 拉伸窗口后: 3。2QGridLayout相互嵌套 示例代码:intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QGridLayoutlayoutnewQGridLayout;QVBoxLayoutVlytnewQVBoxLayout;QWidgetw;QPushButtonbtn1(test1,w);QPushButtonbtn2(test2,w);QPushButtonbtn3(test3,w);QPushButtonbtn4(test4,w);QPushButtonbtn5(test5,w);btn1。setMinimumSize(100,60);btn2。setMinimumSize(100,60);btn3。setMinimumSize(100,60);btn4。setMinimumSize(100,30);btn4btn5按钮需要缩小高度btn5。setMinimumSize(100,30);设置大小策略,Expanding表示组件可扩展btn1。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn2。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn3。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn4。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);btn5。setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);VlytaddWidget(btn4);VlytaddWidget(btn5);layoutaddWidget(btn1,0,0);layoutaddWidget(btn2,0,1);layoutaddWidget(btn3,1,0);layoutaddLayout(Vlyt,1,1);layoutsetRowStretch(0,1);设置第0行,比例为1layoutsetRowStretch(1,2);设置第1行,比例为2layoutsetColumnStretch(0,1);设置第0列,比例为1layoutsetColumnStretch(1,2);设置第1列,比例为2w。setLayout(layout);设置布局管理器w。show();returna。exec();} 拉伸窗口后: 回到顶部4。QFormLayout表单布局 以表单的方式管理界面组件,专为标签和字段(组件)的形式创建的 表单布局也支持嵌套,可以管理子布局 常用函数:addRow(QWidgetlabel,QWidgetfield);addRow(QWidgetlabel,QLayoutfield);addRow(constQStringlabelText,QWidgetfield);addRow(constQStringlabelText,QLayoutfield);voidsetLabelAlignment(Qt::Alignmentalignment);设置标签对齐方式,比如标签左对齐voidsetRowWrapPolicy(RowWrapPolicypolicy);设置字段包装策略比如参数WrapLongRows:表示给标签足够长空间,如果一行满足不了标签和字段显示,则将字段放在下行显示参数QFormLayout::WrapAllRows:示字段信息总在标签下面列出(占据整个行大小) 示例代码:intmain(intargc,charargv〔〕){QApplicationa(argc,argv);QWidgetw(0,Qt::WindowCloseButtonHint);QLineEditline1(w);QLineEditline2(w);QLineEditline3(w);QFormLayoutlayoutnewQFormLayout;layoutaddRow(姓名:,line1);layoutaddRow(邮箱:,line2);layoutaddRow(地址:,line3);layoutsetRowWrapPolicy(QFormLayout::WrapAllRows);设置字段总在标签下面w。setLayout(layout);w。show();returna。exec();} 效果: 回到顶部5。QStackedLayout栈式布局将所有组件进行垂直管理并且每次只能有一个组件现在在屏幕上只有最顶层的组件才会被最终显示常用于图片播放,安装向导等 特点组件大小一致且充满父组件的显示区能够自由切换需要显示的组件不能直接嵌套其它布局管理器,只能间接嵌套 常用函数:intaddWidget(QWidgetwidget);顺序添加组件intinsertWidget(intindex,QWidgetwidget);插入组件voidremoveWidget(QWidgetwidget);删除组件QWidgetcurrentWidget();返回当前组件intcurrentIndex();返回当前组件索引值voidsetCurrentIndex(intindex);切换当前组件voidsetCurrentWidget(QWidgetwidget);更换当前显示的组件 代码试验:5。1通过定时器自动切换QStackedLayout Widget。hifndefWIDGETHdefineWIDGETHincludeQtGuiincludeQWidgetincludeQObjectclassWidget:publicQWidget{QOBJECTQTimertimer;QStackedLayoutStack;QPushButtonbtn1;QPushButtonbtn2;QPushButtonbtn3;QPushButtonbtn4;privateslots:voidtimehandler();public:explicitWidget(QWidgetparent0);};endifWIDGETH Widget。cppincludeWidget。hincludeQDebugincludeQTimerWidget::Widget(QWidgetparent):QWidget(parent),btn1(test1,this),btn2(test2,this),btn3(test3,this),btn4(test4,this){btn1。setMinimumSize(80,40);StacknewQStackedLayout;StackaddWidget(btn1);StackaddWidget(btn2);StackaddWidget(btn3);StackaddWidget(btn4);StacksetCurrentIndex(0);thissetLayout(Stack);启动定时器QTimertimernewQTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(timehandler()));timerstart(1000);1000ms}voidWidget::timehandler(){staticintindex1;StacksetCurrentIndex((index)4);切换页面qDebug()Timerout;} main。cppintmain(intargc,charargv〔〕){QApplicationapp(argc,argv);Widgetw;w。show();returnapp。exec();} 效果: 5。2验间接嵌套 修改构造函数Widget::Widget(QWidgetparent):QWidget(parent),btn1(test1,this),btn2(test2,this),btn3(test3,this),btn4(test4,this){btn1。setMinimumSize(80,40);QWidgetwnewQWidget;设置多个子组件的父类btn3。setParent(w);btn4。setParent(w);btn3。setMinimumSize(120,60);btn4。setMinimumSize(120,60);通过其它布局管理器来管理QVBoxLayoutVlytnewQVBoxLayout;VlytaddWidget(btn3);VlytaddWidget(btn4);VlytsetSpacing(10);wsetLayout(Vlyt);StacknewQStackedLayout;StackaddWidget(btn1);StackaddWidget(btn2);StackaddWidget(w);StacksetCurrentIndex(0);thissetLayout(Stack);启动定时器QTimertimernewQTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(timehandler()));timerstart(1000);1000ms} 效果 点击领取Qt学习资料视频教程链接