精华内容
下载资源
问答
  • qt布局控件
    千次阅读
    2022-05-05 18:27:53

    qt初学者,最近在用qt做界面时,发现在一个窗口里用了布局后,窗口里所有的控件的尺寸都平均分配了,而我的实际需求是想要一个控件固定大小另一个控件随窗口自适应变化。
    比如我现在有一个窗口,给他设置了竖直布局,里面有两个控件A和B。我想让A控件的高度始终为10,B控件的高度随窗口自适应变化。当我直接把两个控件添加进窗口并设置布局之后,发现两个控件的高度始终是均分。

    问题出在控件的maxmumSize属性的设置上。
    在这里插入图片描述
    maxmumSize表示该控件可以扩展的最大宽度和高度。可以看到默认的是一个很大的数。当每一个控件的高度都设置为这个数之后,就会均分窗口的高度。如果想要一个控件保持固定高度,那么就设置这个控件的maxmumSize的高度为你想要的大小,另一个控件设置为默认的最大数,那么就可以实现开头所说的效果了。

    如果想要让各个控件始终保持某个比例来自适应调整大小的话,可以使用窗口的layoutStretch属性来设置。

    更多相关内容
  • Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局Qt动态控件生成并布局...
  • qt布局控件

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

    Qt布局管理详解(5种布局控件)

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

    当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。

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

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

    在这里插入图片描述

    图 1 各个布局管理类的继承关系

    标题QVBoxLayout垂直布局

    垂直布局指的是将所有控件从上到下(或者从下到上)依

    展开全文
  • Qt-5种布局控件详解

    千次阅读 2021-12-26 12:10:55
    作为一款成熟的 GUI 框架,Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事: 自动调整控件的位置,包括控件之间的间距、对齐等; 当用户调整窗口大小时,位于布局管理器内的...

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

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


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

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


    图 1 各个布局管理类的继承关系

    QVBoxLayout垂直布局

    垂直布局指的是将所有控件从上到下(或者从下到上)依次摆放,例如:
     


    图 2 QVBoxLayout垂直布局


    图 2 展示了 4 个 QPushButton 按钮利用 QVBoxLayout 垂直布局的效果。实际场景中,QVBoxLayout 中还可以放置其它控件,比如 QLabel 文本框、QLineEdit 单行输入框等。

    程序中使用 QVBoxLayout 布局控件,需提前引入<QVBoxLayout>头文件。每个 QVBoxLayout 控件本质都是 QVBoxLayout 类的实例对象,该类提供了两个构造函数,分别是:

    QVBoxLayout()
    QVBoxLayout(QWidget *parent)

    创建 QVBoxLayout 控件的同时可以指定父窗口,那么它将作为父窗口中管理其它控件的工具;也可以暂时不指定父窗口,待全部设置完毕后再将其添加到某个窗口中。

    QVBoxLayout 类没有新增任何成员方法,它只能使用从父类继承的成员方法,下表给大家罗列了常用的一些:
     

    表 1 QVBoxLayout常用方法
    成员方法功 能
    void QBoxLayout::addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())向布局管理器中添加指定的 widget 控件。

    默认情况下,stretch 拉伸系数为 0,表示 widget 控件的尺寸为默认值;alignment 是一个枚举类型参数,默认值也是 0,表示该控件会填满占用的整个空间。
    void QBoxLayout::addStretch(int stretch = 0)添加一个空白行,整个窗口中除了控件占用的区域外,其它区域可以由多个(≥0)空白行分摊,分摊比例取余于各个空白行设置的 stretch 参数的值。

    strech 参数的默认值为 0,表示当窗口很小时,空白行可以不占据窗口空间。当窗口中包含多个 strech 值为 0 的空白行时,它们会平分窗口中的空白区域。
    void QBoxLayout::addSpacing(int size)添加一个 size 大小的固定间距。
    void QLayout::setMargin(int margin)设置布局管理器中所有控件的外边距,上、下、左、右外边距的大小都为 margin。默认情况下,所有方向的外边距为 11 px。
    void QLayout::setContentsMargins(int left, int top, int right, int bottom)设置布局管理器中所有控件的外边距,和 setMargin() 的区别是,此方法可以自定义上、下、左、右外边距的值。
    void QBoxLayout::setDirection(Direction direction)设置布局管理器中控件的布局方向,Direction 是一个枚举类型,对于 QVBoxLayout 布局管理器,direction 参数的值通常选择 QBoxLayout::TopToBottom(从上到下依次摆放)或者 QBoxLayout::BottomToTop(从下到上依次摆放)。
    bool QBoxLayout::setStretchFactor(QWidget *widget, int stretch)设置布局管理器中某个控件的拉伸系数。
    bool QBoxLayout::setStretchFactor(QLayout *layout, int stretch)布局管理器内部可以再放置一个布局管理器,该方法用来设置内部某个布局管理器的拉伸系数。


    举个简单的例子:

     
    
    1. #include <QApplication>
    2. #include <QWidget>
    3. #include <QLabel>
    4. #include <QVBoxLayout>
    5. int main(int argc, char *argv[])
    6. {
    7. QApplication a(argc, argv);
    8. //创建主窗口
    9. QWidget widget;
    10. widget.setWindowTitle("QVBoxLayout垂直布局");
    11. //创建垂直布局管理器
    12. QVBoxLayout *layout=new QVBoxLayout;
    13. //设置布局管理器中所有控件从下往上依次排列
    14. layout->setDirection(QBoxLayout::BottomToTop);
    15. //连续创建 3 个文本框,并设置它们的背景和字体大小
    16. QLabel lab1("Label1");
    17. lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    18. lab1.setAlignment(Qt::AlignCenter);
    19. QLabel lab2("Label2");
    20. lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
    21. lab2.setAlignment(Qt::AlignCenter);
    22. QLabel lab3("Label3");
    23. lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
    24. lab3.setAlignment(Qt::AlignCenter);
    25. //将 3 个文本框和 2 个空白行添加到管理器中,它们的伸缩系数比是 2:1:2:3:3
    26. layout->addStretch(2);
    27. layout->addWidget(&lab1,1);
    28. layout->addWidget(&lab2,2);
    29. layout->addWidget(&lab3,3);
    30. layout->addStretch(3);
    31. //将布局管理器添加到 widget 窗口中
    32. widget.setLayout(layout);
    33. widget.show();
    34. return a.exec();
    35. }

    程序中做了以下几个操作:

    • 通过调用 setDirection() 方法,将添加到 QVBoxLayout 管理器中的所有控件(包括空白行)按照从下到上的顺序依次摆放。举个例子,由于 lab1 文本框是第二个添加到管理器中的,因此在最终显示的界面中,lab1 位于倒数第二的位置。
    • 通过调用 addStrech() 方法,向管理器中先后添加了两个空白行,它们的伸缩系数分别为 2 和 3,因此 widget 窗口中的空白区域会平均分为 5 份,一个空白行占 3 份,另一个占 2 份。
    • 通过调用 addWidget() 方法,向管理器中先后添加了 3 个文本框,它们的拉伸系数比为 1:2:3,所以当我们拉伸 widget 窗口时,三个文本框的大小(宽度)呈现 1:2:3 的关系。
    • 通过调用 setLayout() 方法,成功地将 layout 布局管理器添加到了 widget 窗口中。当然,也可以在创建 layout 对象时指定 widget 作为它的父窗口,两种方式是完全等价的。


    执行结果为:


    图 3 QVBoxLayout 实例演示

    QHBoxLayout水平布局

    水平布局指的是将所有控件从左到右(或者从右到左)依次摆放,例如:
     


    图 4 QHBoxLayout水平布局


    使用 QHBoxLayout 水平布局控件,程序中要提前引入<QHBoxLayout>头文件。QHBoxLayout 和 QVBoxLayout 继承自同一个类,它们的用法非常相似,比如 QHBoxLayout 类也提供了两个构造函数:

    QHBoxLayout()
    QHBoxLayout(QWidget *parent)

    QHBoxLayout 类也没有新添任何成员方法,它只能使用从父类继承的成员方法。因此,表 1 中罗列的所有成员方法也同样适用于 QHBoxLayout 对象。

    注意,当 QHBoxLayout 对象调用表 1 中的 addStretch() 方法时,表示添加一个空白列。

    举个简单的例子:

     
    
    1. #include <QApplication>
    2. #include <QWidget>
    3. #include <QLabel>
    4. #include <QHBoxLayout>
    5. int main(int argc, char *argv[])
    6. {
    7. QApplication a(argc, argv);
    8. //创建主窗口
    9. QWidget widget;
    10. widget.setWindowTitle("QHBoxLayout水平布局");
    11. //创建水平布局管理器
    12. QHBoxLayout *layout=new QHBoxLayout;
    13. //设置布局管理器中所有控件的布局方向为从右往左依次排列
    14. layout->setDirection(QBoxLayout::RightToLeft);
    15. //连续创建 3 个文本框,并设置它们的背景和字体大小
    16. QLabel lab1("Label1");
    17. lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    18. lab1.setAlignment(Qt::AlignCenter);
    19. QLabel lab2("Label2");
    20. lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
    21. lab2.setAlignment(Qt::AlignCenter);
    22. QLabel lab3("Label3");
    23. lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
    24. lab3.setAlignment(Qt::AlignCenter);
    25. //将 3 个文本框和 2 个空白列添加到管理器中,它们的拉伸系数比是 2:1:2:3:3
    26. layout->addStretch(2);
    27. layout->addWidget(&lab1,1);
    28. layout->addWidget(&lab2,2);
    29. layout->addWidget(&lab3,3);
    30. layout->addStretch(3);
    31. //将布局管理器添加到 widget 窗口中
    32. widget.setLayout(layout);
    33. widget.show();
    34. return a.exec();
    35. }

    程序执行结果为:


    图 5 QHBoxLayout水平布局实例

    图 5 中,最左侧和最右侧各添加了一个空白列,它们的伸缩比例为 3:2,即它们的宽度比为 3:2。

    QGridLayout网格布局

    网格布局又称格栅布局或者表格布局,指的是将一些控件按照行和列排列在窗口上,例如:
     


    图 6 QGridLayout网格布局


    QGridLayout 的行标和列标都从 0 开始,例如图 6 中 one 按钮的位置为 (0, 0),Four 按钮的位置为 (2, 0)。我们可以随意指定 QGridLayout 的行数和列数,各个控件可以随意摆放,必要时某些位置可以空着不用。

    使用 QGridLayout 网格控件,程序中需引入<QGridLayout>头文件。每个 QGridLayout 控件都是 QGridLayout 类的一个实例对象,该类提供了两个构造函数,分别是:

    QGridLayout(QWidget *parent)
    QGridLayout()


    QGridLayout 类提供了很多实用的成员方法,常用的如下表所示:

    表 2 QGridLayout常用方法
    成员方法功 能
    int QGridLayout::rowCount() const获取网格的行数。
    int QGridLayout::columnCount() const获取网格的列数。
    void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())将 widget 控件添加到网格中的 (row,column) 位置处,并且可以自定义该控件的对齐方式。
    void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())将 widget 控件从 (fromRow, fromColumn) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该控件的对齐方式。
    void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())向网格中的 (row, column) 位置处添加 layout 布局管理器。
    void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())将 layout 布局管理器从  (row, column) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该布局控件的对齐方式。
    void QGridLayout::setColumnStretch(int column, int stretch)给指定的第 column 列设置伸缩系数。
    void QGridLayout::setRowStretch(int row, int stretch)给指定的第 row 行设置伸缩系数。
    void QGridLayout::setColumnMinimumWidth(int column, int minSize)设置第 column 列的最小宽度。
    void QGridLayout::setRowMinimumHeight(int row, int minSize)设置第 row 行的最小宽度。


    举个简单的例子:

     
    
    1. #include <QApplication>
    2. #include <QWidget>
    3. #include <QLabel>
    4. #include <QGridLayout>
    5. #include <QPushButton>
    6. int main(int argc, char *argv[])
    7. {
    8. QApplication a(argc, argv);
    9. //创建主窗口
    10. QWidget widget;
    11. widget.setWindowTitle("QGridLayout网格布局");
    12. //创建 4 个按钮和 1 个文本框
    13. QPushButton *but1 = new QPushButton("but1");
    14. QPushButton *but2 = new QPushButton("but2");
    15. QLabel *lab3 = new QLabel("lab");
    16. lab3->setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    17. lab3->setAlignment(Qt::AlignCenter);
    18. QPushButton *but3 = new QPushButton("but3");
    19. QPushButton *but4 = new QPushButton("but4");
    20. //创建网格布局控件
    21. QGridLayout *layout = new QGridLayout;
    22. //向 layout 中添加控件,并指定各个控件的位置
    23. layout->addWidget(but1, 0, 0);
    24. layout->addWidget(but2, 0, 2);
    25. layout->addWidget(lab3, 1, 0, 3, 3);
    26. layout->addWidget(but3, 4, 0);
    27. layout->addWidget(but4, 4, 2);
    28. //将 layout 添加到 widget 窗口中
    29. widget.setLayout(layout);
    30. widget.show();
    31. return a.exec();
    32. }

    程序运行结果为:


    图 7 QGridLayout网格布局实例

    图 7 中,文本框控件从 (1,0) 位置开始,占据了 3 行 3 列的表格空间。

    QFormLayout表单布局

    Qt 提供了很多种输入框控件,包括 QLineEdit 单行输入框、QTextEdit 多行输入框等。通常情况下,每个输入框的旁边都会附带一些文字(又称标签),用来提示用户需要输入的信息。例如,图 8 中第一个输入框的标签为 "Name",提示用户填写自己的姓名。
     


    图 8 QFromLayout表单布局


    生成图 8 这样的界面,实现的方法有很多,例如:

    1. 分别创建 3 个 QLabel 控件和 3 个 QLineEdit 控件,手动指定它们的位置;
    2. 在 QHBoxLayout 中嵌套 3 个 QVBoxLayout,又或者在 QVBoxLayout 中嵌套 3 个 QHBoxLayout,然后再添加 3 个 QLabel 控件和 3 个 QLineEdit 控件;
    3. 使用 QGridLayout 创建一个 3 行 2 列的表格,向表格中添加 3 个 QLabel 控件和 3 个 QLineEdit 控件。
    4. 使用 QFormLayout 表单布局控件实现。


    第 1 种方法最大的弊端在于,各个控件的尺寸都是固定的,不会随着父窗口尺寸的改变而改变。第 2、3、4 种方法都是借助布局控件实现的,各个控件的尺寸可以自动调整,但前两种方法需要手动设置每一列的 strech 拉伸系数,而第 4 种方式不需要。总之对于生成类似图 8 这样的表单窗口,建议大家使用 QFormLayout 控件,因为使用 QFormLayout 编写的代码量最少,开发效率最高。 

    QFormLayout 可以容纳很多个输入框以及对应的标签,并将它们从上到下依次排列在界面上(如图 8 所示)。大多数情况下,QFormLayout 底层是用 QGridLayout 网格布局管理器实现的,和后者不同的是,QFormLayout 只包含 2 列(不限制行数),且第一列放置标签,第二列放置输入框。

    使用 QFormLayout 布局控件之前,程序中应引入<QFormLayout>头文件。每一个表单布局控件都是 QFormLayout 类的一个实例对象,该类仅提供了一个构造函数:

     
    
    • QFormLayout(QWidget *parent = Q_NULLPTR)


    下表给大家罗列了操作 QFormLayout 对象常用的一些成员方法:
     

    表 3 QFormLayout常用方法
    成员方法功 能
    void QFormLayout::addRow(QWidget *label, QWidget *field)将指定的 field 控件和存储标签的 label 控件添加到表单控件中的末尾。 
    void QFormLayout::addRow(const QString &labelText, QWidget *field)将指定的 field 控件和 labelText 标签添加到表单控件的末尾。
    void QFormLayout::insertRow(int row, const QString &labelText, QWidget *field)将指定的 field 控件和 labelText 标签插入到表单控件中指定行的位置。
    void QFormLayout::removeRow(int row)删除表单控件中的指定行。
    void QFormLayout::removeRow(QWidget *widget)删除表单控件中 widget 控件所在的行。
    void setRowWrapPolicy(RowWrapPolicy policy)设置标签的显示格式,默认标签位于控件的左侧。

    RowWrapPolicy 是 QFormLayout 中定义的枚举类型,该类型包含 3 个值:
    • QFormLayout::DontWrapRows:标签始终在输入框的左侧;
    • QFormLayout::WrapLongRows:根据输入框的尺寸,标签可能位于输入框的左侧,也可能位于上方;
    • QFormLayout::WrapAllRows:标签始终在输入框的上方;
    void QFormLayout::setSpacing(int spacing)将行间距和列间距设置为 spacing。


    举个简单的例子:

     
    
    1. #include <QApplication>
    2. #include <QWidget>
    3. #include <QLineEdit>
    4. #include <QFormLayout>
    5. int main(int argc, char *argv[])
    6. {
    7. QApplication a(argc, argv);
    8. //创建主窗口
    9. QWidget widget;
    10. widget.setWindowTitle("QFormLayout表单布局");
    11. //创建 4 个按钮和 1 个文本框
    12. QFormLayout* layout = new QFormLayout();
    13. //设置表单中的标签都位于控件的上方
    14. layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
    15. //添加 3 行输入框和标签
    16. layout->addRow("Name:",new QLineEdit());
    17. layout->addRow("Email:",new QLineEdit());
    18. layout->addRow("Adress:",new QLineEdit());
    19. //设置行间距和列间距为 10
    20. layout->setSpacing(10);
    21. //将 layout 表单添加到 widget 窗口中
    22. widget.setLayout(layout);
    23. widget.show();
    24. return a.exec();
    25. }

    程序运行结果为:


    图 9 QFormLayout表单布局实例

    QStackedLayout分组布局

    QStackedLayout 布局管理器可以容纳多个控件或者窗口,但每次只显示其中的一个。

    举个简单的例子,下图中的界面就使用了 QStackedLayout 布局管理器:


    图 10 QStackedLayout布局管理器


    整个窗口被一分为二,左侧是 QListWidget 列表控件,右侧是 QStackedLayout 布局管理器。QStackedLayout 中包含 QPushButonn、QLabel 和 QLineEdit 这 3 个控件,但每次只能 3 个控件中的一个。

    QStackedLayout 自身无法切换当前显示的控件或窗口,实际应用时通常和 QListWidget 或者 QComboBox 搭配使用。


    使用 QStackedLayout 布局控件,程序中必须先引入<QStackedLayout>头文件。 每个 QStackedLayout 控件都是 QStackedLayout 类的一个实例对象,该类提供有 3 个构造函数,分别是:

    QStackedLayout()
    QStackedLayout(QWidget *parent)
    QStackedLayout(QLayout *parentLayout)

    借助第二个构造函数,我们可以将 QStackedLayout 添加到指定的 parent 窗口中;借助第三个构造函数,我们可以将 QStackedLayout 嵌入到指定的 parentLayout 布局控件中

    本节学习的 5 种布局控件都可以嵌套使用,例如将 QVBoxLayout 放到 QHBoxLayout 内部、将 QGridLayout 放到 QStackedLayout 内部等。

    下表罗列了操作 QStackedLayout 对象常用的一些成员方法:

    表 4 QStackedLayout常用方法
    成员方法功 能
    int QStackedLayout::addWidget(QWidget *widget)将 widget 控件添加到 QStackedLayout 控件中。
    int QStackedLayout::insertWidget(int index, QWidget *widget)将 widget 控件插入到 QStackedLayout 控件指定的位置处。
    信号函数功 能
    void QStackedLayout::currentChanged(int index)切换当前显示的控件时,会触发此信号,index 为显示的新控件的索引。
    void QStackedLayout::widgetRemoved(int index)移除某个控件时,会触发此信号,index 为被移除控件的索引。
    槽函数功 能
    void setCurrentIndex(int index)将第 index 个控件作为要显示的控件。
    void QStackedLayout::setCurrentWidget(QWidget *widget)设置 widget 作为当前要实现的控件。注意,必须保证 widget 存储在 QStackedLayout 控件中。


    这里我们以图 10 所示的窗口为例,实现代码如下:

     
    
    1. #include <QApplication>
    2. #include <QWidget>
    3. #include <QPushButton>
    4. #include <QLabel>
    5. #include <QLineEdit>
    6. #include <QStackedLayout>
    7. #include <QListWidget>
    8. #include <QHBoxLayout>
    9. int main(int argc, char *argv[])
    10. {
    11. QApplication a(argc, argv);
    12. //创建主窗口
    13. QWidget widget;
    14. widget.setWindowTitle("QStackedLayout分组布局");
    15. widget.resize(600,400);
    16. //向主窗口中添加一个水平布局控件
    17. QHBoxLayout *layout=new QHBoxLayout;
    18. //创建一个列表
    19. QListWidget listWidget(&widget);
    20. listWidget.setMinimumWidth(150);
    21. listWidget.setFont(QFont("宋体",14));
    22. listWidget.addItem("QPushButton");
    23. listWidget.addItem("QLabel");
    24. listWidget.addItem("QLineEdit");
    25. //新建 3 个窗口,分别放置文本框、按钮和单行输入框
    26. QWidget widget1;
    27. widget1.setMinimumSize(400,400);
    28. QPushButton but1("这是一个按钮",&widget1);
    29. QWidget widget2;
    30. widget2.setMinimumSize(400,400);
    31. QLabel lab1("这是一个文本框",&widget2);
    32. QWidget widget3;
    33. widget3.setMinimumSize(400,400);
    34. QLineEdit edit("这是一个单行输入框",&widget3);
    35. //创建一个分组布局,将 3 个窗口添加到分组控件中
    36. QStackedLayout *stackedLayout = new QStackedLayout;
    37. stackedLayout->addWidget(&widget1);
    38. stackedLayout->addWidget(&widget2);
    39. stackedLayout->addWidget(&widget3);
    40. //layout 第一列添加 QListWidget 控件,第二列添加分组布局控件,设置它们的伸缩系数比为 1:4
    41. layout->addWidget(&listWidget,1);
    42. layout->addLayout(stackedLayout,4);
    43. //将 layout 水平布局控件添加到 widget 窗口中
    44. widget.setLayout(layout);
    45. widget.show();
    46. //连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
    47. QObject::connect(&listWidget,&QListWidget::currentRowChanged,stackedLayout,&QStackedLayout::setCurrentIndex);
    48. return a.exec();
    49. }

    此程序中,我们在 QHBoxLayout 水平布局控件内又放置了一个 QStackedLayout 分组布局控件。感兴趣的读者可以编写程序,测试其它布局控件之间嵌套的效果。

    展开全文
  • 布局示例 横向布局(Horizontal):
  • 2.2 布局控件组 开发一个图形界面应用程序,界面的布局影响到界面的美观。前面的程序中都是使用UI界面拖控件,如果有多个按钮,会出现大小难调整、位置难对齐等问题。Qt 提供的“布局管理“就很好的解决了控件摆放...
  • Qt自定义控件GridLayout

    2017-12-13 09:22:22
    自定义布局控件 实现功能 1、控件增(前插、后插)、删 2、设置列数 3、设置滚动条显示与隐藏 有什么更好的建议请留言...
  • QT动态添加控件,并且自动布局
  • QT:控件在垂直布局中居中

    千次阅读 2021-01-27 10:03:52
  • QT布局控件空隙

    2019-11-25 11:34:21
    情况概述:有时候我们在QT布局时发现,两个子窗口之间有恒定的间隔,或是子窗口边界无法和父窗口重合,有间隙,无法缩小了,有时候对界面的紧凑性很有影响 解决方案:对其父窗口的属性进行设置,一般子窗口会继承父...
  • 主要讲述QT基础布局中的三种布局:垂直、水平、网格布局。以及由垂直和水平的混合布局
  • 使小部件在Qt布局中部分重叠

    千次阅读 2021-07-19 18:06:44
    I am trying to make widgets overlap partly in a Qt layout. My current layout is the following, achieved with a QVBoxLayout containing four QHBoxLayout children:I'm trying to regroup cards of the same ...
  • 我们需要我们的布局控件,随窗口变化而变化
  • QT widget控件自适应窗口大小,修改比例
  • 1、如果要改变位置关系,方法1是直接setGeometry,还有一种方法是添加布局控件。如果不设置两者位置关系,控件都会直接从坐标0, 0开始放置: 2、添加垂直布局#include #include #include #include #include int main...
  • QT布局控件拉伸

    2021-07-21 16:43:52
    原文链接:https://blog.csdn.net/hyongilfmmm/article/details/83015729 另外垂直水平布局的拉伸要注意设置控件间的spacing(addspacing()函数),如果不设置此参数,在界面改变大小时会均分空间。
  • 一、Qt的三大布局 QHBoxLayout: 水平显示布局,所有在其上面摆放的控件只能水平排列下去; QVBoxLayout: 垂直显示布局,所有在其上面摆放的控件只能垂直排列下去; QGridLayout 格子显示布局,可以按照...
  • 使部件在Qt布局中部分重叠

    千次阅读 2020-12-23 15:15:12
    还有就是QT文档中一个详细的例子正好解决你的问题:Layout Management基本上,你需要定义如下:的数据结构来存储布局处理的项目。每个项目都是一个QLayoutItem。addItem(),如何将项目添加到布局。setGeometry(),...
  • Qt 控件填满布局——设置布局边距

    千次阅读 2020-04-14 11:08:36
    一 UI法 修改参数 二 代码法 layout->setContentsMargins(0, 0, 0, 0);
  • QT控件自适应布局

    千次阅读 2021-09-01 17:07:49
    Qt中,窗口里面用来布局控件主要通过以下途径: layouts方式 通过选择以上四种不同选项,形成不同的Layout风格常见如下。 水平布局: 垂直布局 还有栅格布局。实际操作中当我们把所有部件布局完成后可能是这...
  • Qt布局父子控件

    千次阅读 2020-07-21 19:17:44
    1.QT对象间可以存在父子关系 (1)每一个对象都保存有它所有子对象的指针 (2)每一个对象都有一个指向其父对象的指针 2.当指定QT对象的父对象时 (1)其父对象会在对象链表中加入该对象的指针 (2)该对象会保存...
  • Qt控件----空间间隔

    千次阅读 2021-08-19 17:04:42
    控件简介2. 用法示例3. 运行效果 空间间隔 一、QSpacerltem 空间间隔组(Spacers),如下图所示 (1) Horizontal Spacer:水平间隔 (2) Vertical Spacer:垂直间隔 QSpacerItem 继承 QLayoutItem。QSpacerItem ...
  • 布局管理器刚开始用的时候,会出现比例不是自己想要的,又或者自动缩放尺寸不理想,这个时候就会想要设置布局管理器中控件的大小,达到理想布局。 使用函数: 1.设置布局管理器内部尺寸比例: QVBoxLayout::...
  • 如图,在界面布局时,将几个QT控件进行布局时,默认边缘时有一定间隙的(红框标注),有时为了美观,可以将布局边缘的间隙设置成我们想要的宽度 具体设置方法: 默认边缘间隙为11,设置
  • 布局后,控件坐标默认为(0,0). 重写事件event获取 bool event(QEvent *e); bool getpos::event(QEvent *e) { if (QEvent::WindowActivate == e->type()) { //获取位置 } return QWidget::event(e); }
  • qt中如何调整布局控件中子元素大小

    千次阅读 2022-02-12 16:53:45
    widget程序里主窗口里拖动了一个verticallayout,然后向里面添加了3个控件,发现控件的大小没法调整。 解决办法: 在verticallayout的layoutstretch属性里设置,比如:3个控件,设置为:3,2,4,意思是这三个控件的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,862
精华内容 5,544
关键字:

qt布局控件