• Qt 布局(QLayout 类&QStackedWidget 类) 总结


    一、QLayout类(基本布局)

    QLayout类是Qt框架中用于管理和排列QWidget控件的布局类。它提供了一种方便而灵活的方式来自动布局QWidget控件。QLayout类允许您以一种简单的方式指定如何安排控件,并能够自动处理控件的位置和大小,以使其适应更改的父窗口的大小。

    QLayout类有多种布局类型可供选择,包括水平布局(QHBoxLayout)、垂直布局(QVBoxLayout)、网格布局(QGridLayout)、堆叠布局(QStackedLayout)和表单布局(QFormLayout)等。每种布局类型都有其特定的用途和优势。

    使用QLayout类来布局控件可以减少手动计算和调整控件位置和大小的麻烦,同时也可以确保应用程序的可移植性和可伸缩性,让您的应用程序更加灵活和易于维护。

    案例分析:

    实现显示员工信息

    代码示例:

    dialog.h

    1. #ifndef DIALOG_H
    2. #define DIALOG_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. class Dialog : public QDialog
    11. {
    12. Q_OBJECT
    13. public:
    14. Dialog(QWidget *parent = nullptr);
    15. ~Dialog();
    16. private:
    17. // 1:左边 网格布局、表格布局
    18. QGridLayout *lLayout;
    19. QLabel *UserNumber;
    20. QLineEdit *UserNumberLineEdit;
    21. QLabel *UserName;
    22. QLineEdit *UserNameLineEdit;
    23. QLabel *UserSex;
    24. QComboBox *UserSexCombobox;
    25. QLabel *UserDepart;
    26. QTextEdit *UserDepartTextEdit;
    27. QLabel *UserAge;
    28. QLineEdit *UserAgeLineEdit;
    29. // 2:右边 水平布局
    30. QHBoxLayout *toprightlayout;
    31. QVBoxLayout *rightlayout;
    32. QLabel *MyselfInfo;
    33. QTextEdit *MyselfInfoTextEdit;
    34. // 3:右边底部
    35. QPushButton *okbutton,*cancelbutton;
    36. QHBoxLayout *buttomLayout;
    37. };
    38. #endif // DIALOG_H

    dialog.cpp

    1. #include "dialog.h"
    2. Dialog::Dialog(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. setWindowTitle("员工信息");
    6. // 左边控件
    7. UserNumber=new QLabel("员工编号:");
    8. UserNumberLineEdit=new QLineEdit;
    9. UserName=new QLabel("员工姓名:");
    10. UserNameLineEdit=new QLineEdit;
    11. UserSex=new QLabel("员工性别:");
    12. UserSexCombobox=new QComboBox;
    13. UserSexCombobox->addItem("男");
    14. UserSexCombobox->addItem("女");
    15. UserDepart=new QLabel("所在部门:");
    16. UserDepartTextEdit=new QTextEdit;
    17. UserAge=new QLabel("员工年龄:");
    18. UserAgeLineEdit=new QLineEdit;
    19. // 网格布局
    20. lLayout=new QGridLayout();
    21. lLayout->addWidget(UserNumber,0,0); // // 员工编号
    22. lLayout->addWidget(UserNumberLineEdit,0,1);
    23. lLayout->addWidget(UserName,1,0);
    24. lLayout->addWidget(UserNameLineEdit,1,1);
    25. lLayout->addWidget(UserSex,2,0);
    26. lLayout->addWidget(UserSexCombobox,2,1);
    27. lLayout->addWidget(UserDepart,3,0);
    28. lLayout->addWidget(UserDepartTextEdit,3,1);
    29. lLayout->addWidget(UserAge,4,0);
    30. lLayout->addWidget(UserAgeLineEdit,4,1);
    31. lLayout->setColumnStretch(0,1);
    32. lLayout->setColumnStretch(1,3);
    33. // 右边上部分
    34. toprightlayout=new QHBoxLayout();
    35. toprightlayout->setSpacing(25);
    36. MyselfInfo=new QLabel("个人简历:");
    37. MyselfInfoTextEdit=new QTextEdit;
    38. rightlayout=new QVBoxLayout();
    39. rightlayout->addLayout(toprightlayout);
    40. rightlayout->addWidget(MyselfInfo);
    41. rightlayout->addWidget(MyselfInfoTextEdit);
    42. // 右边下部分
    43. okbutton=new QPushButton("确认");
    44. cancelbutton=new QPushButton("退出");
    45. buttomLayout=new QHBoxLayout();
    46. buttomLayout->addStretch();
    47. buttomLayout->addWidget(okbutton);
    48. buttomLayout->addWidget(cancelbutton);
    49. //
    50. QGridLayout *mlayout=new QGridLayout(this);
    51. mlayout->setMargin(20);
    52. mlayout->setSpacing(10);
    53. mlayout->addLayout(lLayout,0,0); // 左边
    54. mlayout->addLayout(rightlayout,0,1); // 右上
    55. mlayout->addLayout(buttomLayout,1,0,1,2);
    56. mlayout->setSizeConstraint(QLayout::SetFixedSize);
    57. }
    58. Dialog::~Dialog()
    59. {
    60. }

    main.cpp

    1. #include "dialog.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Dialog w;
    7. w.show();
    8. return a.exec();
    9. }

    二、QStackedWidget 类 (堆栈窗体)

    QStackedWidget类是一个堆栈窗口部件,它可以包含多个子部件(页面),但是一次只能显示其中一个页面。通过在这些页面上的导航动作,用户可以在页面之间移动。

    QStackedWidget是一个非常有用的类,可以为用户提供一种非常方便的方式来组织和访问应用程序的不同部分。它可以用于构建单页应用程序或多页应用程序,也可以用于构建向导式应用程序。

    QStackedWidget继承自QWidget类,它具有以下方法和属性:

    • addWidget():向QStackedWidget中添加子部件。
    • currentIndex():返回当前显示的子部件的索引号。
    • setCurrentIndex():设置要显示的子部件的索引号。
    • widget():返回指定索引号的子部件。

    QStackedWidget类还有一些信号,例如currentChanged(),在当前子部件改变时发出。这些信号可以连接到槽函数中,以执行特定的操作。

    总之,QStackedWidget类提供了一种方便的方式来实现多页应用程序,用户可以在不同的页面之间进行导航,以方便地访问应用程序中的不同部分。

    案例分析:

    实现功能如下

    代码示例:

    stackeddlg.h

    1. #ifndef STACKEDDLG_H
    2. #define STACKEDDLG_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. class stackedDlg : public QDialog
    8. {
    9. Q_OBJECT
    10. public:
    11. stackedDlg(QWidget *parent = nullptr);
    12. ~stackedDlg();
    13. public:
    14. QStackedWidget *statcks;
    15. QListWidget *qlist; // 列表框控件创建
    16. QLabel *lab1,*lab2,*lab3,*lab4,*lab5;
    17. };
    18. #endif // STACKEDDLG_H

    main.cpp

    1. #include "stackeddlg.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. stackedDlg w;
    7. w.show();
    8. return a.exec();
    9. }

    stackeddlg.cpp

    1. #include "stackeddlg.h"
    2. #include
    3. stackedDlg::stackedDlg(QWidget *parent)
    4. : QDialog(parent)
    5. {
    6. setWindowTitle("堆栈窗体测试");
    7. qlist=new QListWidget(this);
    8. qlist->insertItem(0,"Linux1");
    9. qlist->insertItem(1,"Linux2");
    10. qlist->insertItem(2,"Linux3");
    11. qlist->insertItem(3,"Linux4");
    12. qlist->insertItem(4,"Linux5");
    13. lab1=new QLabel("Linux1 Qt");
    14. lab2=new QLabel("Linux2 Qt");
    15. lab3=new QLabel("Linux3 Qt");
    16. lab4=new QLabel("Linux4 Qt");
    17. lab5=new QLabel("Linux5 Qt");
    18. statcks=new QStackedWidget(this);
    19. statcks->addWidget(lab1);
    20. statcks->addWidget(lab2);
    21. statcks->addWidget(lab3);
    22. statcks->addWidget(lab4);
    23. statcks->addWidget(lab5);
    24. QHBoxLayout *mlayout=new QHBoxLayout(this);
    25. mlayout->setMargin(10);
    26. mlayout->setSpacing(20);
    27. mlayout->addWidget(qlist);
    28. mlayout->addWidget(statcks,0,Qt::AlignCenter);
    29. mlayout->setStretchFactor(qlist,1);
    30. mlayout->setStretchFactor(statcks,5);
    31. }
    32. stackedDlg::~stackedDlg()
    33. {
    34. }
  • 相关阅读:
    Day9:面试必考选择题目
    ARM汇编基础指令整合
    MongoDB集群之复制集,分片
    回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测
    java多线程-Lock对象的使用
    NFS网络文件系统
    ITO服务涵盖了BPO(业务流程外包)、IDC驻场运维以及IDC工程实施等多个类别
    d的is表达式
    Halcon实例转OpenCvSharp(C# OpenCV)实现--瓶口缺陷检测(附源码)
    1002:输出第二个整数
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/133800942