布局管理器,有方向,间距,addwidget
类描述QBoxLayout水平或垂直排列控件的基类QButtonGroup组织按钮的容器QFormLayout管理输入控件和其相关的标签QGraphicsAnchor表示在QGraphicsAnchorLayout中两个项目之间的锚QGraphicsAnchorLayout在图形视图中可以将锚连接到一起QGridLayout网格布局(多行多列)QGroupBox带标题的分组框QHBoxLayout水平排列控件QLayout几何管理器的基类QLayoutItem抽象的操作布局ItemQSizePolicy描述水平和垂直大小调整的策略QSpacerItem布局中的空间隔QStackedLayout切换控件,同一时间只有一个控件可见QStackedWidget切换控件,同一时间只有一个控件可见QVBoxLayout垂直排列控件QWidgetItem表示一个控件的布局项拥有QHBoxLayout和QVBoxLayout
set 函数描述QBoxLayout(QBoxLayout::Direction dir, QWidget *parent = nullptr)构造函数virtual ~QBoxLayout()析构函数void addLayout(QLayout *layout, int stretch = 0)添加void addSpacerItem(QSpacerItem *spacerItem)添加spaceitemvoid addSpacing(int size)间距void addStretch(int stretch = 0)可以让其居左或者居右或者居中,看例子void addStrut(int size)void addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = …)对齐方式QBoxLayout::Direction direction() const方向void insertItem(int index, QLayoutItem *item)插入void insertLayout(int index, QLayout *layout, int stretch = 0)插入void insertSpacerItem(int index, QSpacerItem *spacerItem)void insertSpacing(int index, int size)void insertStretch(int index, int stretch = 0)void insertWidget(int index, QWidget *widget, int stretch = 0, Qt::Alignment alignment = …)void setDirection(QBoxLayout::Direction direction)设置方向void setSpacing(int spacing)设置空格void setStretch(int index, int stretch)设置长度bool setStretchFactor(QWidget *widget, int stretch)可以进行伸缩bool setStretchFactor(QLayout *layout, int stretch)int spacing() const返回间距int stretch(int index) const返回长度 /* * hbox and vbox 是box确定方向之后的产物,没啥特殊 * box 属性有间距addspace,空白补齐addstrlen,以及方向direction * 他的函数也全部用来操作上面的属性 */ mywidget::mywidget() { setWindowTitle("my widget test"); QHBoxLayout *layout=new QHBoxLayout(this); //垂直的布局 QWidget *pvwidget=new QWidget(this); QBoxLayout *pvlayout=new QBoxLayout(QBoxLayout::BottomToTop,pvwidget); //布局管理器 for(int i=0;i<5;i++) { QPushButton *ppushbutton=new QPushButton("vertical"+QString::number(i+1,10)); pvlayout->addWidget(ppushbutton); } //水平的布局 QWidget *phwidget=new QWidget(this); QBoxLayout *phlayout=new QBoxLayout(QBoxLayout::RightToLeft,phwidget); //布局管理器 for(int i=0;i<5;i++) { phlayout->addStretch();//添加伸缩,此时会均分长度,但是在第一个控件前添加,会居右,最后一个控件后添加会居左 QPushButton *ppushbutton=new QPushButton("horizontal"+QString::number(i+1,10)); phlayout->addWidget(ppushbutton); if(i==2)phlayout->setStretchFactor(ppushbutton,2); //第三个可以进行拉伸 ppushbutton->setFixedHeight(70); ppushbutton->setStyleSheet("font-size:30px;background:red;"); } //间距space的设置 pvlayout->setSpacing(0); phlayout->setSpacing(50); //其他 pvlayout->setContentsMargins(50,50,50,50); //边距 layout->addWidget(pvwidget); layout->addWidget(phwidget); this->show(); }一般不常用,需要是看文档
mywidget::mywidget() { QLineEdit *nameLineEdit=new QLineEdit(this); QLineEdit *emailLineEdit=new QLineEdit(this); QSpinBox *ageSpinBox=new QSpinBox(this); QFormLayout *formLayout = new QFormLayout; formLayout->addRow(tr("&Name:"), nameLineEdit); formLayout->addRow(tr("&Email:"), emailLineEdit); formLayout->addRow(tr("&Age:"), ageSpinBox); setLayout(formLayout); this->show(); }找到现在的位置,可以到达想去的位置 QStackedWidget类似
函数描述int addWidget(QWidget *widget)添加widgetint currentIndex() const返回位置QWidget * currentWidget() const返回位置int insertWidget(int index, QWidget *widget)插入wedgetvoid setStackingMode(QStackedLayout::StackingMode stackingMode)void setCurrentIndex(int index)到达想去的wibgetvoid setCurrentWidget(QWidget *widget)到达想去的位置signal
void currentChanged(int index) void widgetRemoved(int index) /* * QStackedLayout * addwidget添加widget * currentIndex()返回现在的位置 * sercurrentindex()设置现在的位置 */ mywidget::mywidget() { //主要的布局 setWindowTitle("widget test"); QVBoxLayout *mainLayout = new QVBoxLayout(this); QLabel *now_index=new QLabel(this); QPushButton *next_widget=new QPushButton("下一页"); QPushButton *prior_widget=new QPushButton("上一页"); QLineEdit *to_widget=new QLineEdit; to_widget->setPlaceholderText("跳转到页数"); QPushButton *summit=new QPushButton("跳转"); QHBoxLayout *menu_widget_layout=new QHBoxLayout; menu_widget_layout->addWidget(prior_widget); menu_widget_layout->addWidget(next_widget); menu_widget_layout->addWidget(to_widget); menu_widget_layout->addWidget(summit); menu_widget_layout->addWidget(now_index); //可以跳转页面的layout QStackedLayout *stack_layout = new QStackedLayout; QWidget *widget_1 = new QWidget; QWidget *widget_2 = new QWidget; QWidget *widget_3 = new QWidget; stack_layout->addWidget(widget_1); stack_layout->addWidget(widget_2); stack_layout->addWidget(widget_3); mainLayout->addLayout(menu_widget_layout); mainLayout->addLayout(stack_layout); now_index->setText("第"+QString::number(stack_layout->currentIndex()+1,10) +"页,共"+QString::number(stack_layout->count(),10) +"页"); //信号和槽,实现上一页,下一页,跳转功能 connect(summit,QOverload<bool>::of(&QPushButton::clicked),[stack_layout,to_widget]{ if(stack_layout->currentIndex() >=0 && stack_layout->currentIndex()<=stack_layout->count()-1) stack_layout->setCurrentIndex(to_widget->text().toInt()-1); }); connect(prior_widget,QOverload<bool>::of(&QPushButton::clicked),[stack_layout]{ if(stack_layout->currentIndex() >=0 && stack_layout->currentIndex()<=stack_layout->count()-1) stack_layout->setCurrentIndex(stack_layout->currentIndex()-1); }); connect(next_widget,QOverload<bool>::of(&QPushButton::clicked),[stack_layout]{ if(stack_layout->currentIndex() >=0 && stack_layout->currentIndex()<=stack_layout->count()-1) stack_layout->setCurrentIndex(stack_layout->currentIndex()+1); }); connect(stack_layout,QOverload<int>::of(&QStackedLayout::currentChanged),[now_index,stack_layout]{ now_index->setText("第"+QString::number(stack_layout->currentIndex()+1,10) +"页,共"+QString::number(stack_layout->count(),10) +"页"); }); setLayout(mainLayout); this->show(); }