Qt - 布局管理器

实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。作为一款成熟的 GUI 框架,Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事:

  • 自动调整控件的位置,包括控件之间的间距、对齐等;
  • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。


总之借助布局管理器,我们无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。

Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QGridLayout(网格布局)、QFormLayout(表单布局)和 QStackedLayout(分组布局),它们的继承关系如下图所示:

 

1. 盒子布局(QBoxLayout)

QBoxLayout:可以在水平方向或垂直方向上排列控件,分别派生了QHBoxLayout、QVBoxLayout子类。

水平/垂直布局跟盒子布局除了构造时的方向(LeftToRight、TopToBottom)不同外,其它均相同。

构造方式:

QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::Direction::LeftToRight);//盒子布局
QHBoxLayout* hlayout = new  QHBoxLayout();//水平布局
QVBoxLayout* vlayout = new  QVBoxLayout();//垂直布局

 

公有函数

函数 描述
void addLayout(QLayout* layout,int stretch = 0) 将layout添加到框的末端,使用连续拉伸因子拉伸。 
void addSpacerItem(QSpacerItem * spacerItem) 将spaceeritem添加到该盒子布局的末尾,通常不使用这个函数,请使用addSpacing(int size)
void addSpacerItem(QSpacerItem * spacerItem) 添加一个大小为size的不可伸缩空间(QSpacerItem)到这个框布局的末尾
void addStretch(int stretch = 0) 添加一个可伸缩空间(一个QSpacerItem),最小尺寸为零,拉伸因子stretch到这个框布局的末尾。 
void addStretch(int stretch = 0) 限制盒子的垂直尺寸最小为size
void addWidget(QWidget* widget,int stretch = 0,Qt::Alignment alignment = 0) 将小部件添加到此框布局的末尾,并使用拉伸因子拉伸和对齐对齐。
void setDirection(QBoxLayout::Direction direction) 设置此布局的方向为direction。 
void setSpacing(int spacing) 设置小部件之间的间距 
void setStretch(int index,int stretch) 给index位置的控件设置拉伸因子stretch
bool setStretchFactor(QWidget* widget,int stretch) bool setStretchFactor(QWidget* widget,int stretch) 设置小部件的拉伸因子,如果在布局中发现小部件(不包括子布局),则返回true; 否则返回false。
void QLayout::setMargin(int margin) 设置布局管理器中所有控件的外边距,上、下、左、右外边距的大小都为 margin。默认情况下,所有方向的外边距为 11 px。
void QLayout::setContentsMargins(int left, int top, int right, int bottom) 设置布局管理器中所有控件的外边距,和 setMargin() 的区别是,此方法可以自定义上、下、左、右外边距的值。

下面来讲解QBoxLayout、QHBoxLayout、QVBoxLayout的使用。

 

示例代码:

//创建需要布局的小部件
QLabel* nameLabel = new QLabel("name");
QLineEdit* nameEdit = new QLineEdit;

//创建布局
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::LeftToRight); //从左到右
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::RightToLeft); //从右到左
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::TopToBottom); //从上到下
QBoxLayout* boxlayout = new QBoxLayout(QBoxLayout::BottomToTop); //从下到上

//把小部件添加到布局
boxlayout->addWidget(nameLabel);
boxlayout->addWidget(nameEdit);

//给当前窗口设置布局
this->setLayout(boxlayout);

 

1.1 水平布局(QHBoxLayout)

QHBoxLayout:水平布局,在水平方向上排列控件,即:水平布局指的是将所有控件从左到右(或者从右到左)依次摆放。

示例代码:

    QPushButton* btn1 = new QPushButton("test1");
    QPushButton* btn2 = new QPushButton("test2");
    QPushButton* btn3 = new QPushButton("test3");
    btn1->setFixedSize(60,36);
    btn2->setFixedSize(60,36);
    btn3->setFixedSize(60,36);

    QHBoxLayout *hlayout = new QHBoxLayout;

    hlayout->addWidget(btn1);//向布局管理器添加组件,实现自动布局
    hlayout->addWidget(btn2);
    hlayout->addWidget(btn3);

    this->setLayout(hlayout);//为部件设置布局管理器

    hlayout->setSpacing(5);//设置间距

 

 

1.2 垂直布局(QVBoxLayout)

QVBoxLayout:垂直布局,在垂直方向上排列控件,即:垂直布局指的是将所有控件从上到下(或者从下到上)依次摆放。

示例代码:

    QPushButton* btn1 = new QPushButton("test1");
    QPushButton* btn2 = new QPushButton("test2");
    QPushButton* btn3 = new QPushButton("test3");
    btn1->setFixedSize(60,36);
    btn2->setFixedSize(60,36);
    btn3->setFixedSize(60,36);

    QVBoxLayout *vlayout = new QVBoxLayout;

    vlayout->addWidget(btn1);//向布局管理器添加组件,实现自动布局
    vlayout->addWidget(btn2);
    vlayout->addWidget(btn3);
    this->setLayout(vlayout);//为部件设置布局管理器

    vlayout->setSpacing(5);//设置间距

 

 

1.3 嵌套布局

嵌套布局就是QBoxLayout、QHBoxLayout、QVBoxLayout组合使用

示例代码:

    //姓名
    QLabel* nameLabel = new QLabel("Name:");
    QLineEdit* nameEdit = new QLineEdit;
    
    //电话
    QLabel* phoneLabel = new QLabel("Phone:");
    QLineEdit* phoneEdit = new QLineEdit;
    
    //水平布局
    QHBoxLayout* hlayout1 = new QHBoxLayout();
    QHBoxLayout* hlayout2 = new QHBoxLayout();
    hlayout1->addWidget(nameLabel);
    hlayout1->addWidget(nameEdit);
    hlayout2->addWidget(phoneLabel);
    hlayout2->addWidget(phoneEdit);
    
    //布局嵌套
    QVBoxLayout* vlayout = new QVBoxLayout(this);
    vlayout->addLayout(hlayout1);
    vlayout->addLayout(hlayout2);
    this->setLayout(vlayout);//设置布局管理器,由于Vlayout管理着Hlayout1 Hlayout2,所以只填写一个即可

运行效果:

 

1.4 成员函数

  • 设置外边距
void setMargin(int margin);//设置外边距
void setContentsMargins(int left,int top,int right,int bottom);// 设置(左、上、右、下)的外边距

这两个函数的区别:

  • setMargin( )是QLayout类的成员函数;QLayout类既可以调用setMargin()也可以调用setContentsMargins()
    hlayout2->setMargin(0);//外边距为0
    hlayout2->setContentsMargins(0, 0, 0, 0);
  • setContentsMargins( )是QWidget类的成员函数;QWidget不能调用setMargin()
    widget->setContentsMargins(0, 0, 0, 0);

 

这里我使用setMargin(0)将外边距设置为0。注意:每创建一个Layout建议都是setMargin(0)将外边距设置为0,否则的话会有默认的外边距,导致控件与控件之间有间隙。

 

  • 设置间距

这里的间距指的是每个小部件之间的间距

void setSpacing(int spacing)

 

  • 添加间距
void addSpacing(int size);

示例代码:

    QPushButton* btn1 = new QPushButton("test1");
    QPushButton* btn2 = new QPushButton("test2");
    QPushButton* btn3 = new QPushButton("test3");
    btn1->setFixedSize(60,36);
    btn2->setFixedSize(60,36);
    btn3->setFixedSize(60,36);

    QHBoxLayout *hlayout = new QHBoxLayout;

    hlayout->addWidget(btn1);//向布局管理器添加组件,实现自动布局
    hlayout->addSpacing(30);//在btn1和btn2之间添加30间距
    hlayout->addWidget(btn2);
    hlayout->addWidget(btn3);

    this->setLayout(hlayout);//为部件设置布局管理器

    hlayout->setSpacing(2);//设置间距
    hlayout->setContentsMargins(50,20,50,20);// 设置(左、上、右、下)的外间距

 

 

  • 设置布局方向
void setDirection(QBoxLayout::Direction direction)
//可以设置从左到右、从右到左、从上到下、从下到上等。。。

setDirection(QBoxLayout::RightToLeft)

setDirection(QBoxLayout::TopToBottom);

既然使用了QHBoxLayout,一般就不建议使用QBoxLayout的策略TopToBottom或者BottomToTop,如果实在确定不了方向,或者方向可以随意变化,那么建议使用QBoxLayout。

 

  • 添加拉伸空间

QHBoxLayout* hlayout = new QHBoxLayout;
hlayout->addStretch();      //添加拉伸空间
hlayout->addWidget(btn1);

在第一个控件之前添加伸缩,这样所有的控件就会居右显示。

在最后一个控件之后添加伸缩,这样所有的控件就会居左显示。

在第一个控件之前,最后一个空间之后添加伸缩,这样所有的控件就会居中显示。

 

  • 设置拉伸系数

当窗体大小变化时,控件会根据拉伸系数来做相应的调整。

//设置小部件的拉伸因子,如果在布局中发现小部件(不包括子布局),则返回true; 否则返回false。  
bool setStretchFactor(QWidget *widget, int stretch)
bool setStretchFactor(QLayout *layout, int stretch)
    
hlayout->setStretchFactor(btn2,1);
hlayout->setStretchFactor(btn3,2);

设置btn2的拉伸系数为1,btn3拉伸系数为2,当窗体变大时,会优先将btn3进行拉伸,当达到一定程度时,再拉伸btn2,btn2与btn3的宽度比例为1:2。

 

  • 添加弹簧控件

创建水平弹簧和垂直弹簧:

//创建窗口的布局
QVBoxLayout *layout = new QVBoxLayout(this);

// 在布局中添加一个标签
QLabel *label = new QLabel("Hello World");
layout->addWidget(label);

// 添加水平弹簧
QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
layout->addSpacerItem(horizontalSpacer);
// 添加垂直弹簧
QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
layout->addSpacerItem(verticalSpacer);

// 添加水平弹簧
QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Fixed);
layout->addSpacerItem(horizontalSpacer);
// 添加垂直弹簧
QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Fixed, QSizePolicy::Expanding);
layout->addSpacerItem(verticalSpacer);

第一种创建方式:

#include <QSpacerItem>

QVBoxLayout* vlayout = new QVBoxLayout(this);
QSpacerItem *sp = new QSpacerItem(100,25,QSizePolicy::Expanding,QSizePolicy::Fixed);
vlayout->addItem(sp);

第二种创建方式:

vlayout->addItem(new QSpacerItem(100,25,QSizePolicy::Expanding,QSizePolicy::Fixed));

 

  • 添加控件

void addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = 0)

默认是居中对齐的,我们把其中一个按钮的高度设置大一点,就可以看到非常明显了~

    //创建按钮
    QPushButton* btn1 = new QPushButton("btn1");
    QPushButton* btn2 = new QPushButton("btn2");
    QPushButton* btn3 = new QPushButton("btn3");
    btn3->setFixedSize(80,60);
    QPushButton* btn4 = new QPushButton("btn4");
    QPushButton* btn5 = new QPushButton("btn5");

    //创建水平布局
    QHBoxLayout* hlayout = new QHBoxLayout;
    hlayout->setSpacing(5);//设置间距
    hlayout->addStretch(); //添加拉伸空间
    hlayout->addWidget(btn1);//居中对齐
    hlayout->addWidget(btn2);//居中对齐
    hlayout->addWidget(btn3);//居中对齐
    hlayout->addWidget(btn4);//居中对齐
    hlayout->addWidget(btn5);//居中对齐

    this->setLayout(hlayout);//设置布局管理器

下面,我们使用向上、向下对齐来设置其它控件。

    //创建按钮
    QPushButton* btn1 = new QPushButton("btn1");
    QPushButton* btn2 = new QPushButton("btn2");
    QPushButton* btn3 = new QPushButton("btn3");
    btn3->setFixedSize(80,60);
    QPushButton* btn4 = new QPushButton("btn4");
    QPushButton* btn5 = new QPushButton("btn5");

    //创建水平布局
    QHBoxLayout* hlayout = new QHBoxLayout;
    hlayout->setSpacing(5);//设置间距
    hlayout->addStretch(); //添加拉伸空间
    hlayout->addWidget(btn1,0,Qt::AlignmentFlag::AlignTop);//向上对齐
    hlayout->addWidget(btn2,0,Qt::AlignmentFlag::AlignTop);//向上对齐
    hlayout->addWidget(btn3,0);//居中对齐
    hlayout->addWidget(btn4,0,Qt::AlignmentFlag::AlignBottom);//向下对齐
    hlayout->addWidget(btn5,0,Qt::AlignmentFlag::AlignBottom);//向下对齐

    this->setLayout(hlayout);//设置布局管理器

 

  • 添加布局
    //创建控件
    QLabel* nameLabel = new QLabel("姓名:");
    QLabel* phoneLabel = new QLabel("电话:");
    QLineEdit* nameEdit = new QLineEdit();
    nameEdit->setFixedWidth(150);
    QLineEdit* phoneEdit = new QLineEdit();
    phoneEdit->setFixedWidth(150);

    //创建水平布局和添加控件
    QHBoxLayout* hlayout1 = new QHBoxLayout();
    hlayout1->addWidget(nameLabel);
    hlayout1->addWidget(nameEdit);
    //创建水平布局和添加控件
    QHBoxLayout* hlayout2 = new QHBoxLayout();
    hlayout2->addWidget(phoneLabel);
    hlayout2->addWidget(phoneEdit);

    //布局嵌套
    //创建垂直布局
    QVBoxLayout* vlayout = new QVBoxLayout(this);
    vlayout->addLayout(hlayout1);//添加布局
    vlayout->addLayout(hlayout2);//添加布局

运行效果:

 

2. 网格布局(QGridLayout)

网格布局也叫格栅布局(多行多列)

QGridLayout占用它可用的空间(通过它的父布局或parentWidget()),将它分成行和列,并将它管理的每个小部件放入正确的单元格中。

列和行表现相同; 我们将讨论列,但行也有等价的函数。

每一列都有一个最小宽度和一个拉伸因子。 最小宽度是使用setColumnMinimumWidth()设置的最大宽度和该列中每个小部件的最小宽度。 拉伸因子使用setColumnStretch()设置,并确定列将获得的可用空间超过或超过必要的最小空间的多少。

2.1 公有函数

函数 描述

void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = 0)

将layout放置在网格中的位置(row、column)。 左上角的位置是(0,0)。 跨越多行/多列。 该单元格将从跨rowSpan行和columnSpan列的行、列开始。

void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)

这是一个重载函数。

void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = 0)

将给定小部件添加到单元格的行、列位置。左上角的位置默认为(0, 0)。对齐方式由align指定。默认的对齐方式是0,这意味着小部件填充整个单元格。

 void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0)

这是一个重载函数。
void setRowStretch(int row, int stretch) 将row的拉伸因子设置为stretch
void setColumnStretch(int column, int stretch) 将column的拉伸因子设置为stretch
void setRowMinimumHeight(int row, int minSize) 将行的最小宽度设置为minSize像素。 
void setColumnMinimumWidth(int column, int minSize) 将列的最小宽度设置为minSize像素。 
void setSpacing(int spacing)
设置间距
void setHorizontalSpacing(int spacing)
设置水平间距
void setVerticalSpacing(int spacing)
设置垂直间距

 

示例代码1:

QLabel* imageLabel = new QLabel;                         
QLineEdit* userNamaeEdit = new QLineEdit;                
QLineEdit* passwdEdit = new QLineEdit;                   
QCheckBox* rememberCheckBox = new QCheckBox;             
QCheckBox* autoLoginCheckBox = new QCheckBox;            
QPushButton* registerBtn = new QPushButton;              
QPushButton* forgetBtn = new QPushButton;                
QPushButton* loginBtn = new QPushButton;                 
                                                         
//设置图片                                                   
imageLabel->setFixedSize(90,90);                         
imageLabel->setPixmap(QPixmap("://images/loginIcon.png"));
imageLabel->setScaledContents(true);                     
                                                         
//设置输入框                                                  
userNamaeEdit->setPlaceholderText("QQ号码/手机/邮箱");         
passwdEdit->setPlaceholderText("密码");                    
                                                         
//设置复选框                                                  
rememberCheckBox->setText("记住密码");                       
autoLoginCheckBox->setText("自动登录");                      
                                                         
//设置按钮                                                   
registerBtn->setText("注册账号");                            
forgetBtn->setText("找回密码");                              
loginBtn->setText("登录");

//创建网格布局控件                                                         
QGridLayout* layout = new QGridLayout;

//向 layout 中添加控件,并指定各个控件的位置
layout->addWidget(imageLabel,0,0,3,1);// 头像 第0行,第0列开始,占3行1列                 
layout->addWidget(userNamaeEdit,0,1,1,2);// 用户名输入框 第0行,第1列开始,占1行2列                
layout->addWidget(registerBtn,0,3);//注册账号按钮 第0行,第3列开始                      
layout->addWidget(passwdEdit,1,1,1,2);// 密码输入框 第1行,第1列开始,占1行2列                   
layout->addWidget(forgetBtn,1,3);//找回密码按钮 第1行,第3列开始                      
layout->addWidget(rememberCheckBox,2,1,1,1, Qt::AlignLeft | Qt::AlignVCenter);// 记住密码 第2行,第1列开始,占1行1列 水平居左 垂直居中               
layout->addWidget(autoLoginCheckBox,2,2,1,1, Qt::AlignRight | Qt::AlignVCenter);// 自动登录 第2行,第2列开始,占1行1列 水平居右 垂直居中        
layout->addWidget(loginBtn,3,1,1,2);// 登录按钮 第3行,第1列开始,占1行2列                 
                                                         
layout->setHorizontalSpacing(10);// 设置水平间距                        
layout->setVerticalSpacing(10);// 设置垂直间距                          
layout->setContentsMargins(20,20,20,20);// 设置外间距                 

//将 layout 添加到 widget 窗口中
this->setLayout(layout);

 

示例代码2:

    QGridLayout* gridlayout = new QGridLayout;
    QSpacerItem* spaceritem = new QSpacerItem(120, 50, QSizePolicy::Expanding, QSizePolicy::Fixed);//创建弹簧

    QPushButton *btn1 = new QPushButton("btn1");
    QPushButton *btn2 = new QPushButton("btn2");
    QPushButton *btn3 = new QPushButton("btn3");
    QPushButton *btn4 = new QPushButton("btn4");
    QPushButton *btn5 = new QPushButton("btn5");

    //在网格布局内部再嵌套水平布局
    QTextEdit *pEdit = new QTextEdit;
    QVBoxLayout *pVLayout = new QVBoxLayout;
    pVLayout->addWidget(btn1);
    pVLayout->addWidget(pEdit);

    gridlayout->addLayout(pVLayout,0,0);
    gridlayout->addWidget(btn2,0,1);//添加到(第0行,第1列)
    gridlayout->addWidget(btn3,0,2);//添加到(第0行,第2列)
    gridlayout->addItem(spaceritem, 1, 0);// 添加到(第1行,第0列)
    gridlayout->addWidget(btn4,2,0);//添加到(第1行,第0列)
    gridlayout->addWidget(btn5,2,1);//添加到(第1行,第1列)
    gridlayout->setContentsMargins(20,20,20,20);// 设置外间距
    this->setLayout(gridlayout);

 

3. 表单布局(QFormLayout)

QFormLayout类管理输入小部件的表单及其关联的标签

QFormLayout 是一个方便的布局类,它以两列形式布置其子项。 左列由标签组成,右列由“字段”小部件(行编辑器、旋转框等)组成。 传统上,这种两列表单布局是使用 QGridLayout 实现的。

QFormLayout 是一种更高级别的替代方案,具有以下优点:

  • 遵守不同平台的外观和感觉准则 例如,macOS Aqua 和 KDE 指南指定标签应该右对齐,而 Windows 和 GNOME 应用程序通常使用左对齐。

  • 支持长行换行

    对于显示较小的设备,QFormLayout可以设置为对长行进行换行,甚至对所有行进行换行。

  • 创建标签-字段对,有非常方便的API 我们可以通过addRow(const QString &labelText, QWidget *field)来创建一个带有给定文本的QLabel及QWidget控件行,它们可以自动的设置为伙伴关系。

3.1 公有函数

函数 描述

void addRow(QWidget* label,QWidget* field)

void addRow(QWidget* label,QLayout* field)

使用给定的label和field在此表单布局的底部添加新行

void addRow(const QString &labelText, QWidget* field

void addRow(const QString &labelText, QLayout* field)

这个重载会在后台自动创建一个以labelText作为文本的QLabel。 field被设置为新的QLabel的伙伴

void addRow(QWidget *widget)

void addRow(QLayout* layout)

在表单布局的末尾添加指定的小部件。 这个小部件横跨两列
void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy) true
void setSpacing(int spacing) 将垂直和水平间距设置为spacing。
void setVerticalSpacing(int spacing) 将垂直间距设置为spacing
void setWidget(int row, QFormLayout::ItemRole role, QWidget *widget) 将给定的row中的role设置为widget,必要时使用空行扩展布局。 如果单元格已被占用,则不插入小部件,并将错误消息发送到控制台。

 

示例代码:

QLineEdit* userEdit = new QLineEdit;
QLineEdit* passwdEdit = new QLineEdit;
QPushButton* loginBtn = new QPushButton("确定");
​
QFormLayout* fromLayout = new QFormLayout;
fromLayout->addRow("userName:",userEdit);
fromLayout->addRow("password:",passwdEdit);
fromLayout->addWidget(loginBtn);
​
this->setLayout(fromLayout);

 

 

 

  • 设置换行策略 void setRowWrapPolicy(QFormLayout::RowWrapPolicy policy)

    枚举 描述 效果
    QFormLayout::DontWrapRows 字段总是放在它们的标签旁边(默认样式)
    QFormLayout::WrapLongRows 标签有足够的空间适应,如果字段对的最小大小大于可用空间,输入框会被换到下一行
    QFormLayout::WrapAllRows 字段总是在它们的标签下面。
  • 设置控件 void setWidget(int row, QFormLayout::ItemRole role, QWidget *widget)

    • 将给定角色的给定行中的小部件设置为widget,必要时使用空行扩展布局。

 

内容 描述
QFormLayout::LabelRole 0 标签
QFormLayout::FieldRole 1 字段
QFormLayout::SpanningRole 2 跨标签和字段列的小部件

 

QFormLayout * flayout = new QFormLayout;
flayout->setWidget(0,QFormLayout::ItemRole::LabelRole,new QLabel("LabelRole"));
flayout->setWidget(0,QFormLayout::ItemRole::FieldRole,new QLineEdit("FieldRole"));
flayout->setWidget(1,QFormLayout::ItemRole::SpanningRole,new QPushButton("SpanningRole"));
​
this->setLayout(flayout);

 

4. 堆栈布局(QStackedLayout)

QStackedLayout继承自QLayout。

QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。

QStackedLayout可用于创建类似于QTabWidget提供的用户界面。也有建立在QStackedLayout之上的便利类QStackedWidget

sngnals

//每当布局中的当前小部件发生变化时,都会发出此信号。 index指定新的当前小部件的索引,如果没有新的小部件,则-1
void currentChanged(int index)      
//每当从布局中删除小部件时,都会发出此信号,inded是删除的索引。    
void widgetRemoved(int index)

slots

void setCurrentIndex(int index)
void setCurrentWidget(QWidget *widget)

 

4.1 公有函数

函数 描述
int addWidget(QWidget *widget) 把widget添加到布局中
int insertWidget(int index, QWidget *widget) 把widget插入到指定的下标
void setStackingMode(QStackedLayout::StackingMode stackingMode) 设置子小部件可见性的处理方式。 

 

示例代码:

void Widget::testStackedLayout()
{
    QHBoxLayout *layout = new QHBoxLayout;

    //创建一个列表
    QListWidget* listWidget = new QListWidget(this);
    listWidget->setMinimumWidth(150);
    listWidget->setFont(QFont("宋体",14));
    listWidget->addItem("QPushButton");
    listWidget->addItem("QLabel");
    listWidget->addItem("QLineEdit");

    //新建 3 个窗口,分别放置文本框、按钮和单行输入框
    QWidget* widget1 = new QWidget(this);
    widget1->setMinimumSize(400,400);
    QPushButton* but1 = new QPushButton("这是一个按钮",widget1);

    QWidget* widget2 = new QWidget(this);
    widget2->setMinimumSize(400,400);
    QLabel* lab1 = new QLabel("这是一个文本框",widget2);

    QWidget* widget3 = new QWidget(this);
    widget3->setMinimumSize(400,400);
    QLineEdit* edit = new QLineEdit("这是一个单行输入框",widget3);

    //创建一个分组布局,将 3 个窗口添加到分组控件中
    QStackedLayout *stackedLayout = new QStackedLayout;
    stackedLayout->addWidget(widget1);
    stackedLayout->addWidget(widget2);
    stackedLayout->addWidget(widget3);

    //layout 第一列添加 QListWidget 控件,第二列添加分组布局控件,设置它们的伸缩系数比为 1:4
    layout->addWidget(listWidget,1);
    layout->addLayout(stackedLayout,4);

    //将 layout 水平布局控件添加到 widget 窗口中
    this->setLayout(layout);

    //连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
    connect(listWidget,&QListWidget::currentRowChanged,stackedLayout,&QStackedLayout::setCurrentIndex);
}

 

posted @   [BORUTO]  阅读(820)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示