Qt布局管理器
QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理, 能够自动排列窗口中的界面组件 窗口大小变化后,便会自动更新界面组件的大小。 布局管理器可以自定义,从而达到更加个性化界面布局的效果 布局管理器可以相互嵌套,完成所有常用的界面布局 QLayout是Qt中布局管理器的抽象基类,如下图所示:
回到顶部 1. 实例参考
1 #include "testlayout.h" 2 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 int main(int argc, char *argv[]) 11 { 12 QApplication a(argc, argv); 13 TestLayout w; 14 15 //设置标签,并且设置快捷键 16 QLabel *nameLabel = new QLabel("姓名:(&N)"); 17 QLabel *ageLabel = new QLabel("年龄:(&A)"); 18 QLabel *emailLabel = new QLabel("邮箱:(&E)"); 19 QLabel *numLabel = new QLabel("门牌号码:"); 20 21 //创建三个输入框 22 QLineEdit *nameLineEdit = new QLineEdit; 23 QLineEdit *ageLineEdit = new QLineEdit; 24 QLineEdit *emailLineEdit = new QLineEdit; 25 QLineEdit *numLineEdit = new QLineEdit; 26 27 //设置标签与输入框的伙伴关系 28 nameLabel->setBuddy(nameLineEdit); 29 ageLabel->setBuddy(ageLineEdit); 30 emailLabel->setBuddy(emailLineEdit); 31 numLabel->setBuddy(numLineEdit); 32 33 //表单布局 34 QFormLayout *headerLayout = new QFormLayout; 35 headerLayout->addRow(nameLabel,nameLineEdit); 36 headerLayout->addRow(ageLabel,ageLineEdit); 37 headerLayout->addRow(emailLabel,emailLineEdit); 38 headerLayout->addRow(numLabel,numLineEdit); 39 40 //单选按钮 41 QLabel *sexLabel = new QLabel("性别:"); 42 QRadioButton *mBtn = new QRadioButton; 43 QRadioButton *wBtn = new QRadioButton; 44 mBtn->setText("男"); 45 wBtn->setText("女"); 46 47 //水平布局 QHBoxLayout, H:horizontal 水平 48 QHBoxLayout *sexLayout = new QHBoxLayout; 49 sexLayout->addWidget(sexLabel); 50 sexLayout->addWidget(mBtn); 51 sexLayout->addWidget(wBtn); 52 53 /* 54 * QSpacerItem 为添加空隙的函数,他的四个参数为:空隙区域的宽,空隙区域的高, 高的尺寸策略最小到无限大, 水平方向的的尺寸策略最小到无限大 55 * QSpacerItem(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum)*/ 56 QSpacerItem *spacer = new QSpacerItem(20,10); 57 QSpacerItem *spacerL = new QSpacerItem(50,50); 58 QSpacerItem *spacerR = new QSpacerItem(50,50); 59 60 //添加按钮 61 QPushButton *okBtn = new QPushButton("确定"); 62 63 //为了让确认按钮窄点,将两个空隙放到确认按钮两旁 64 QHBoxLayout *QHLayoutOK = new QHBoxLayout; 65 QHLayoutOK->addItem(spacerL); 66 QHLayoutOK->addWidget(okBtn); 67 QHLayoutOK->addItem(spacerR); 68 69 //垂直布局 QVBoxLayout,V:vertical 垂直 70 QVBoxLayout *mainLayout = new QVBoxLayout; 71 mainLayout->addLayout(headerLayout); //addLayout 添加布局 72 mainLayout->addLayout(sexLayout); 73 mainLayout->addItem(spacer); //addItem 添加空隙 74 //mainLayout->addWidget(okBtn); //addWidget 添加部件 75 mainLayout->addLayout(QHLayoutOK); 76 77 //设置部件与窗体之间的空隙 78 mainLayout->setMargin(25); 79 80 //设置控件之间的间隙 81 mainLayout->setSpacing(10); 82 83 //调用加载窗口的布局 84 w.setLayout(mainLayout); 85 w.show(); 86 return a.exec(); 87 }
回到顶部
点击领取Qt学习资料+视频教程~「链接」
2.QBoxLayout 水平/垂直布局
QBoxLayout有两个子类: QHBoxLayout (水平)和 QVBoxLayout (垂直)
比如垂直布局,表示将垂直方向分为一个个格子,如下图所示:
2.1QVBoxLayout使用(垂直)int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QVBoxLayout *layout=new QVBoxLayout; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("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); layout->addWidget(&btn1); //向布局管理器添加组件,实现自动布局 layout->addWidget(&btn2); layout->addWidget(&btn3); w.setLayout(layout); //为部件设置布局管理器 layout->setSpacing(10); w.show(); return a.exec(); }2.2QHBoxLayout使用(水平)int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QHBoxLayout *layout=new QHBoxLayout; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("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); layout->addWidget(&btn1); //向布局管理器添加组件,实现自动布局 layout->addWidget(&btn2); layout->addWidget(&btn3); w.setLayout(layout); //为部件设置布局管理器 layout->setSpacing(10); w.show(); return a.exec(); }2.3QBoxLayout相互嵌套
1.1与1.2写了 QHBoxLayout (水平)和 QVBoxLayout (垂直),但是只是单方面自动布局.
接下来, 来使用 嵌套 ,来实现 水平+垂直 自动布局,如下图所示:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QHBoxLayout *Hlayout1=new QHBoxLayout; QHBoxLayout *Hlayout2=new QHBoxLayout; QVBoxLayout *Vlayout=new QVBoxLayout; QWidget w; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("test3",&w); QPushButton btn4("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); Hlayout1->addWidget(&btn1); //水平布局: btn1 btn2 Hlayout1->addWidget(&btn2); Hlayout1->setSpacing(10); Hlayout2->addWidget(&btn3); //水平布局: btn3 btn4 Hlayout2->addWidget(&btn4); Hlayout2->setSpacing(10); Vlayout->addLayout(Hlayout1); //垂直布局: Hlayout1 Hlayout2 Vlayout->addLayout(Hlayout2); Vlayout->setSpacing(10); w.setLayout(Vlayout); //设置布局管理器,由于Vlayout管理着Hlayout1 Hlayout2,所以只填写一个即可 w.show(); return a.exec(); }
布局管理器比例系数
默认情况下,组件之间以等比例的方式改变组件大小.
其实用户也可以 自定义 组件之间比例系数,当窗口放大时,便来更新比例系数.
常用函数: QBoxLayout::setStretch ( int index, int stretch ); //设置具体组件的拉伸系数 // index:表示布局管理器里的第几个组件 // stretch :拉伸系数 bool QBoxLayout::setStretchFactor ( QWidget * widget, int stretch ); //设置部件拉伸系数,如果存在*widget这个组件,则设置成功,返回true bool QBoxLayout::setStretchFactor ( QLayout * layout, int stretch ); //设置布局拉伸系数, ,如果存在*layout这个组件,则设置成功,返回true
示例代码如下: int main(int argc, char *argv[]) { QApplication a(argc, argv); QHBoxLayout *Hlayout1=new QHBoxLayout; QHBoxLayout *Hlayout2=new QHBoxLayout; QVBoxLayout *Vlayout=new QVBoxLayout; QWidget w; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("test3",&w); QPushButton btn4("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); Hlayout1->addWidget(&btn1); //水平布局: btn1 btn2 Hlayout1->addWidget(&btn2); Hlayout1->setSpacing(10); Hlayout2->addWidget(&btn3); //水平布局: btn3 btn4 Hlayout2->addWidget(&btn4); Hlayout2->setSpacing(10); Vlayout->addLayout(Hlayout1); //垂直布局: Hlayout1 Hlayout2 Vlayout->addLayout(Hlayout2); Vlayout->setStretchFactor(Hlayout1,1); Vlayout->setStretchFactor(Hlayout2,3); Vlayout->setSpacing(10); w.setLayout(Vlayout); //设置布局管理器,由于Vlayout管理着Hlayout1 Hlayout2,所以只填写一个即可 w.show(); return a.exec(); }
拉伸窗口后:
回到顶部 3.QGridLayout网格布局3.1 以网格的方式管理界面组件
类似于:嵌套方式来使用QBoxLayout.
常用函数: void addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 ); // row column : 表示将widget这个部件放在网格哪个位置 void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 ); // formRow formColumn : 表示将widget这个部件放在网格哪个位置 // rowSpan: widget :这个部件占多少行 // columnSpan: widget :这个部件占多少列 void setColumnStretch(int column,int stretch); //设置列拉伸系数 // column:设置布局管理器里的第几列,第1列为0 void setRowStretch(int row,int stretch); //设置行拉伸系数 // row:设置的第几行
示例代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); QGridLayout *layout=new QGridLayout; QWidget w; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("test3",&w); QPushButton btn4("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); layout->addWidget(&btn1,0,0); layout->addWidget(&btn2,0,1); layout->addWidget(&btn3,1,0); layout->addWidget(&btn4,1,1); layout->setRowStretch(0,1); //设置第0行,比例为1 layout->setRowStretch(1,2); //设置第1行,比例为2 layout->setColumnStretch(0,1); //设置第0列,比例为1 layout->setColumnStretch(1,2); //设置第1列,比例为2 w.setLayout(layout); //设置布局管理器 w.show(); return a.exec(); }
拉伸窗口后:
3.2 QGridLayout相互嵌套
示例代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); QGridLayout *layout=new QGridLayout; QVBoxLayout *Vlyt=new QVBoxLayout; QWidget w; QPushButton btn1("test1",&w); QPushButton btn2("test2",&w); QPushButton btn3("test3",&w); QPushButton btn4("test4",&w); QPushButton btn5("test5",&w); btn1.setMinimumSize(100,60); btn2.setMinimumSize(100,60); btn3.setMinimumSize(100,60); btn4.setMinimumSize(100,30); //btn4 btn5按钮需要缩小高度 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); Vlyt->addWidget(&btn4); Vlyt->addWidget(&btn5); layout->addWidget(&btn1,0,0); layout->addWidget(&btn2,0,1); layout->addWidget(&btn3,1,0); layout->addLayout(Vlyt,1,1); layout->setRowStretch(0,1); //设置第0行,比例为1 layout->setRowStretch(1,2); //设置第1行,比例为2 layout->setColumnStretch(0,1); //设置第0列,比例为1 layout->setColumnStretch(1,2); //设置第1列,比例为2 w.setLayout(layout); //设置布局管理器 w.show(); return a.exec(); }
拉伸窗口后:
回到顶部 4.QFormLayout表单布局
以表单的方式管理界面组件,专为 标签 和 字段(组件) 的形式创建的
表单布局也支持 嵌套 ,可以管理子布局
常用函数: addRow ( QWidget * label, QWidget * field ); addRow ( QWidget * label, QLayout * field ); addRow ( const QString & labelText, QWidget * field ); addRow ( const QString & labelText, QLayout * field ); void setLabelAlignment ( Qt::Alignment alignment ); //设置标签对齐方式,比如标签左对齐 void setRowWrapPolicy ( RowWrapPolicy policy ); //设置字段包装策略 //比如参数WrapLongRows:表示给标签足够长空间,如果一行满足不了标签和字段显示,则将字段放在下行显示 //参数QFormLayout::WrapAllRows: 示字段信息总在标签下面列出(占据整个行大小)
示例代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w(0,Qt::WindowCloseButtonHint); QLineEdit line1(&w); QLineEdit line2(&w); QLineEdit line3(&w); QFormLayout *layout= new QFormLayout; layout->addRow("姓名:",&line1); layout->addRow("邮箱:",&line2); layout->addRow("地址:",&line3); layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //设置字段总在标签下面 w.setLayout(layout); w.show(); return a.exec(); }
效果:
回到顶部 5.QStackedLayout栈式布局将所有组件进行垂直管理 并且每次只能有 一个组件 现在在屏幕上 只有最顶层的组件才会被最终显示 常用于 图片播放 , 安装向导 等
特点 组件大小一致且充满父组件的显示区 能够 自由切换 需要显示的组件 不能直接嵌套其它布局管理器,只能 间接嵌套
常用函数: int addWidget ( QWidget * widget ); //顺序添加组件 int insertWidget ( int index, QWidget * widget ); //插入组件 void removeWidget ( QWidget * widget ); //删除组件 QWidget * currentWidget() ; //返回当前组件 int currentIndex(); //返回当前组件索引值 void setCurrentIndex ( int index ); //切换当前组件 void setCurrentWidget ( QWidget * widget ); //更换当前显示的组件
代码试验: 5.1 通过定时器自动切换QStackedLayout
Widget.h #ifndef WIDGET_H #define WIDGET_H #include #include #include class Widget : public QWidget { Q_OBJECT QTimer *timer; QStackedLayout *Stack; QPushButton btn1; QPushButton btn2; QPushButton btn3; QPushButton btn4; private slots: void time_handler(); public: explicit Widget(QWidget *parent = 0); }; #endif // WIDGET_H
Widget.cpp #include "Widget.h" #include #include Widget::Widget(QWidget *parent) : QWidget(parent), btn1("test1",this), btn2("test2",this), btn3("test3",this), btn4("test4",this) { btn1.setMinimumSize(80,40); Stack = new QStackedLayout; Stack->addWidget(&btn1); Stack->addWidget(&btn2); Stack->addWidget(&btn3); Stack->addWidget(&btn4); Stack->setCurrentIndex(0); this->setLayout(Stack); /*启动定时器*/ QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(time_handler())); timer->start(1000); //1000ms } void Widget::time_handler() { static int index=1; Stack->setCurrentIndex((index++)%4); //切换页面 qDebug()<<"Timer out"; }
main.cpp int main(int argc, char *argv[]) { QApplication app(argc,argv); Widget w; w.show(); return app.exec(); }
效果:
5.2 验间接嵌套
修改构造函数 Widget::Widget(QWidget *parent) : QWidget(parent), btn1("test1",this), btn2("test2",this), btn3("test3",this), btn4("test4",this) { btn1.setMinimumSize(80,40); QWidget *w = new QWidget; /*设置多个子组件的父类*/ btn3.setParent(w); btn4.setParent(w); btn3.setMinimumSize(120,60); btn4.setMinimumSize(120,60); /*通过其它布局管理器来管理*/ QVBoxLayout *Vlyt = new QVBoxLayout; Vlyt->addWidget(&btn3); Vlyt->addWidget(&btn4); Vlyt->setSpacing(10); w->setLayout(Vlyt); Stack = new QStackedLayout; Stack->addWidget(&btn1); Stack->addWidget(&btn2); Stack->addWidget(w); Stack->setCurrentIndex(0); this->setLayout(Stack); /*启动定时器*/ QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(time_handler())); timer->start(1000); //1000ms }
效果
点击领取Qt学习资料+视频教程~「链接」
三个让人瞬间快乐的方法,简单有效我们都在努力地活着。早出晚归,忙东忙西,所求不过一个幸福的生活。但,如果自己都不快乐,生活谈何幸福?人到中年,我们渐渐地明白,管理好自己的情绪,保持良好的心态,让自己过得开心,是一
我高喊无爱者自由可余光还是看向了被爱者为什么要哭呢要多漂亮才算漂亮要多有趣才算有趣你就来这一趟我要你自在而又热烈的活着被爱的时候小雨沾湿我的裙摆我都委屈的不行不被爱的时候大雨滂沱雷声轰鸣我赤脚栽在黑夜雨里越走越快山赶着
80后的你过得好吗?作者简介本人80后育娃狗,生在农村长在城市,高过考从过军(当然落榜了)有工作有贷款,顺心时生活生活充满阳光,困惑时想长眠不醒。80后的你是这样吗?评论区一起排忧解难曾经看过一个短视
人生只有内外兼修,灵魂丰盈,才能真正的过得精彩而美满王阳明说世间磨难,皆是砥砺。人间是道场,淤泥生莲花。这是一种心态,更是一种境界。拥有此境界的人,已经习惯了世间的磨难,具备了抵御和战胜困难的勇气和能力。心胸已变得干净和豁达,已把磨
关于良性的两性关系的基本守则关于良性的两性关系的基本守则1。遇到任何矛盾和冲突时,对事不对人,不要动不动就给人加标签戴帽子,用你的主观认知去贬低对方,差异不是致命的,嫌弃才是致命的2。发自内心地去观察,研究,
善待自己,让一切顺其自然有人说人这一生,只欠自己。的确,人活一世,能自始至终陪在你身边的,只有自己。但也正是因此,你总是习惯性委屈自己。你或许曾为了别人,一度为难自己你或许曾因为倔强,被现实撞得头破血流你
抱团取暖成为奢望我的教授跟我说,人生来孤独,故我们要享受独处。原创勿搬细想来,可不就是这样,人生的路到最后连父母都会离开我们。更何况其他人。我们终日费心劳神维护的社交,好似在抱团取暖,只大家心知肚
丫髻山之行十一假期高速公路免费,这样的羊毛不能不薅。想着去个远点的地方,感觉能多占些便宜。于是,将目标设定为平谷的石林峡(再远就出京了捂脸)。十一的高速公路,跑过的都懂汗。十一点半,才跑到京
朝鲜观察,一名八零后姑娘的朝鲜体验之旅作为一个八零后出生的姑娘,对朝鲜一直充满了好奇。所以,第一次的出国之旅,选择了朝鲜。身边的朋友对我去朝鲜也感到好奇,她们觉得去韩国旅行可能更合适。因为在韩国,有更多的购物场所,有更
神秘的古巴,美洲的朝鲜国,美景与美女并存古巴是四川麻将传播最远的地方古巴青年在街头悠闲地打麻将古巴共和国位于加勒比海的西部,夹在北美洲和南美洲之间,特殊的地理位置造就了他风情万种的绝美景色,这里美景和美女并存!当然更吸引
不意外!江苏女排2大功臣或缺席排超,00后新星全面挑大梁20222023赛季中国女排超级联赛下月或将开战,上届亚军江苏女排本赛季或迎彻底的换血阵容,江苏排协没有给前任队长也是奥运冠军的张常宁报名,女排世锦赛主力龚翔宇带伤上阵归来后恐怕很