• Qt中布局管理使用总结


    目录

    1. 五大布局

    1.1 QVBoxLayout垂直布局

    1.2 QHBoxLayout水平布局

    1.3 QGridLayout网格布局

    1.4 QFormLayout表单布局

    1.5 QStackedLayout分组布局

    1.6 五大布局综合应用

    2. 分割窗口

    3. 滚动区域

    4. 停靠区域


    1. 五大布局

    1.1 QVBoxLayout垂直布局

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


    1.2 QHBoxLayout水平布局

    1. #include
    2. #include
    3. #include
    4. #include
    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. }

    1.3 QGridLayout网格布局

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    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); // 从第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. }

    1.4 QFormLayout表单布局

    1. #include
    2. #include
    3. #include
    4. #include
    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. }

    1.5 QStackedLayout分组布局

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    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. }

    1.6 五大布局综合应用

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include // 用于创建按钮的类
    6. #include // 用于水平布局的类
    7. #include // 用于创建文本框的类
    8. #include // 用于栅格布局的类
    9. #include // 用于创建行文本框的类
    10. #include // 用于表单布局的类
    11. #include // 用于分页布局的类
    12. #include // 用于下拉框的类
    13. namespace Ui {
    14. class MainWindow;
    15. }
    16. class MainWindow : public QMainWindow
    17. {
    18. Q_OBJECT
    19. public:
    20. explicit MainWindow(QWidget *parent = 0);
    21. ~MainWindow();
    22. private:
    23. Ui::MainWindow *ui;
    24. private:
    25. QWidget *m_widget;
    26. private:
    27. //演示表单布局
    28. QLineEdit *nameLineEdit; // 声明 name 文本框
    29. QLineEdit *emailLineEdit; // 声明 email 文本框
    30. //演示水平布局
    31. QPushButton *button1; // 声明按钮1
    32. QPushButton *button2; // 声明按钮2
    33. QPushButton *button3; // 声明按钮3
    34. QPushButton *button4; // 声明按钮4
    35. QPushButton *button5; // 声明按钮5
    36. // 演示垂直布局
    37. QPushButton *button6; // 声明按钮6
    38. QPushButton *button7; // 声明按钮7
    39. QPushButton *button8; // 声明按钮8
    40. QPushButton *button9; // 声明按钮9
    41. QPushButton *button10; // 声明按钮10
    42. // 演示网格布局
    43. QPushButton *button11; // 声明按钮11
    44. QPushButton *button12; // 声明按钮12
    45. QTextEdit *gridTextEdit; // 声明文本框
    46. // 演示分组布局
    47. QPushButton *button13; // 声明按钮13
    48. QPushButton *button14; // 声明按钮14
    49. QPushButton *button15; // 声明按钮15
    50. QPushButton *button16; // 声明按钮16
    51. QPushButton *button17; // 声明按钮17
    52. QPushButton *button18; // 声明按钮18
    53. };
    54. #endif // MAINWINDOW_H

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. /*
    4. //比较常用的布局微调整接口
    5. QBoxLayout::setSpacing(int spacing); 设置组件之间的间隔,
    6. QBoxLayout::addStretch(int stretch = 0); 设置一个占位空间,
    7. QLayout::setContentsMargins(int left, int top, int right, int bottom); 设置布局管理器到边界的距离。
    8. */
    9. MainWindow::MainWindow(QWidget *parent) :
    10. QMainWindow(parent),
    11. ui(new Ui::MainWindow)
    12. {
    13. ui->setupUi(this);
    14. // 设置后页面大小不可调整,一直处于系统推荐大小的状态
    15. //this->setFixedSize(sizeHint());
    16. // 首先创建一个QWidget并设置给QMainWindow,否则布局看不见
    17. m_widget = new QWidget(this);
    18. this->setCentralWidget(m_widget);
    19. // 演示布局管理器到边界的距离 左 上 右 下
    20. m_widget->setContentsMargins(50, 100, 50, 100);
    21. // 设置固定大小
    22. /*
    23. this->setFixedHeight(400);
    24. this->setFixedWidth(600);
    25. */
    26. // 创建按钮1
    27. button1 = new QPushButton("One");
    28. // 创建按钮2
    29. button2 = new QPushButton("Two");
    30. // 创建按钮3
    31. button3 = new QPushButton("Three");
    32. // 创建按钮4
    33. button4 = new QPushButton("Four");
    34. // 创建按钮5
    35. button5 = new QPushButton("Five");
    36. // [1]创建水平页面布局管理对象
    37. QHBoxLayout *hlayout = new QHBoxLayout;
    38. // 向水平布局增加 按钮1
    39. hlayout->addWidget(button1);
    40. // 向水平布局增加 按钮2
    41. hlayout->addWidget(button2);
    42. // 向水平布局增加 按钮3
    43. hlayout->addWidget(button3);
    44. // 向水平布局增加 按钮4
    45. hlayout->addWidget(button4);
    46. // 向水平布局增加 按钮5
    47. hlayout->addWidget(button5);
    48. // 设置水平页面布局是窗口布局
    49. //m_widget->setLayout(hlayout);
    50. // 演示水平布局之间增加间隔
    51. hlayout->setSpacing(200);
    52. // 创建按钮6
    53. button6 = new QPushButton("Six");
    54. // 创建按钮7
    55. button7 = new QPushButton("Seven");
    56. // 创建按钮8
    57. button8 = new QPushButton("Eight");
    58. // 创建按钮9
    59. button9 = new QPushButton("Nine");
    60. // 创建按钮10
    61. button10 = new QPushButton("Ten");
    62. // [2]创建垂直页面布局管理对象
    63. QVBoxLayout *vlayout = new QVBoxLayout;
    64. // 向水平布局增加 按钮6
    65. vlayout->addWidget(button6);
    66. // 向水平布局增加 按钮7
    67. vlayout->addWidget(button7);
    68. // 演示在按钮之间增加一个占位(弹簧)
    69. vlayout->addStretch(1);
    70. // 向水平布局增加 按钮8
    71. vlayout->addWidget(button8);
    72. // 向水平布局增加 按钮9
    73. vlayout->addWidget(button9);
    74. // 向水平布局增加 按钮10
    75. vlayout->addWidget(button10);
    76. // 创建按钮11
    77. button11 = new QPushButton("Eleven");
    78. // 创建按钮12
    79. button12 = new QPushButton("Twelve");
    80. // 创建文本框
    81. gridTextEdit = new QTextEdit();
    82. // [4]创建栅格页面布局管理对象
    83. QGridLayout *gridLayout = new QGridLayout;
    84. gridLayout->addWidget(button11,0,0,1,1);
    85. gridLayout->addWidget(button12,0,1,1,1);
    86. gridLayout->addWidget(gridTextEdit,2,0,4,2);
    87. // 创建行文本框
    88. nameLineEdit = new QLineEdit();
    89. emailLineEdit = new QLineEdit();
    90. // [6]创建表单页面布局管理对象
    91. QFormLayout *formLayout = new QFormLayout;
    92. formLayout->addRow(tr("&Name:"), nameLineEdit);
    93. formLayout->addRow(tr("&Email:"), emailLineEdit);
    94. // [5]创建水平页面布局管理
    95. QHBoxLayout *gridhlayout = new QHBoxLayout;
    96. gridhlayout->addLayout(vlayout);
    97. gridhlayout->addLayout(gridLayout);
    98. // [3]创建垂直页面布局管理对象
    99. QVBoxLayout *layout = new QVBoxLayout;
    100. m_widget->setLayout(layout);
    101. layout->addLayout(formLayout);
    102. layout->addLayout(hlayout);
    103. layout->addLayout(gridhlayout);
    104. // 分页布局
    105. // [7.1]第一步:准备3个页面,每个页面放置一些组件
    106. QWidget *firstPageWidget = new QWidget;
    107. QWidget *secondPageWidget = new QWidget;
    108. QWidget *thirdPageWidget = new QWidget;
    109. // 准备页面组件:创建6个按钮,每个页面放置一个按钮
    110. button13 = new QPushButton("Page 1 button13");
    111. button14 = new QPushButton("Page 1 button14");
    112. button15 = new QPushButton("Page 2 button15");
    113. button16 = new QPushButton("Page 2 button16");
    114. button17 = new QPushButton("Page 3 button17");
    115. button18 = new QPushButton("Page 3 button18");
    116. // 创建3个页面布局,每个页面一个布局
    117. QVBoxLayout *page1layout = new QVBoxLayout;
    118. QHBoxLayout *page2layout = new QHBoxLayout;
    119. QVBoxLayout *page3layout = new QVBoxLayout;
    120. // 给分页布局添加组件
    121. page1layout->addWidget(button13);
    122. page1layout->addWidget(button14);
    123. page2layout->addWidget(button15);
    124. page2layout->addWidget(button16);
    125. page3layout->addWidget(button17);
    126. page3layout->addWidget(button18);
    127. // 设置分页布局
    128. firstPageWidget->setLayout(page1layout);
    129. secondPageWidget->setLayout(page2layout);
    130. thirdPageWidget->setLayout(page3layout);
    131. // [7.2]第二步:创建 QStackedLayout 页面布局管理对象,把分页添加到这个对象上
    132. QStackedLayout *stackedLayout = new QStackedLayout;
    133. // 向分页布局对象添加页面
    134. stackedLayout->addWidget(firstPageWidget);
    135. stackedLayout->addWidget(secondPageWidget);
    136. stackedLayout->addWidget(thirdPageWidget);
    137. // [7.3]第三步:设置分页切换方法,使用 QComboBox或QListWidget 实现
    138. QComboBox *pageComboBox = new QComboBox;
    139. pageComboBox->addItem(tr("Page 1"));
    140. pageComboBox->addItem(tr("Page 2"));
    141. pageComboBox->addItem(tr("Page 3"));
    142. connect(pageComboBox, SIGNAL(activated(int)), stackedLayout, SLOT(setCurrentIndex(int)));
    143. // [7.4]第四步:将 QStackedLayout 布局添加到主布局上,将分页切换组件添加到一个布局上
    144. vlayout->addWidget(pageComboBox);
    145. layout->addLayout(stackedLayout); // 向主页面添加分页布局
    146. }
    147. MainWindow::~MainWindow()
    148. {
    149. delete ui;
    150. }

    main.cpp

    1. #include "mainwindow.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. int main(int argc, char *argv[])
    11. {
    12. QApplication a(argc, argv);
    13. MainWindow wondow;
    14. wondow.show();
    15. return a.exec();
    16. }

    2. 分割窗口

    Qt中提供了 QSplitter 分离器类来实现窗口的分割,分割的窗口是用分割条隔开的,用户可以拖动分割条调整窗口的大小。

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. namespace Ui {
    8. class MainWindow;
    9. }
    10. class MainWindow : public QMainWindow
    11. {
    12. Q_OBJECT
    13. public:
    14. explicit MainWindow(QWidget *parent = 0);
    15. ~MainWindow();
    16. private:
    17. Ui::MainWindow *ui;
    18. private:
    19. QWidget *m_widget;
    20. private:
    21. QTextEdit *textEdit1; // 声明文本框1
    22. QTextEdit *textEdit2; // 声明文本框2
    23. QTextEdit *textEdit3; // 声明文本框3
    24. };
    25. #endif // MAINWINDOW_H

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. MainWindow::MainWindow(QWidget *parent) :
    4. QMainWindow(parent),
    5. ui(new Ui::MainWindow)
    6. {
    7. ui->setupUi(this);
    8. m_widget = new QWidget(this);
    9. this->setCentralWidget(m_widget);
    10. // [1]创建3个文本框
    11. textEdit1 = new QTextEdit();
    12. textEdit2 = new QTextEdit();
    13. textEdit3 = new QTextEdit();
    14. // [2]创建分离器对象
    15. QSplitter* splitter = new QSplitter;
    16. // [3]设置内部组件水平方向布局
    17. splitter->setOrientation(Qt::Horizontal);
    18. // [4]向分离器中,添加组件
    19. splitter->addWidget(textEdit1);
    20. splitter->addWidget(textEdit2);
    21. splitter->addWidget(textEdit3);
    22. /*
    23. * [5]调整3个分割窗口的显示比例 1:1:2
    24. * setStretchFactor函数:
    25. * 第一个参数:窗口索引,从0开始
    26. * 第二个参数:拉伸比例
    27. * 第一个窗口索引0,拉伸1
    28. * 第二个窗口索引1,拉伸1
    29. * 第三个窗口索引2,拉伸2
    30. */
    31. splitter->setStretchFactor(0, 1);
    32. splitter->setStretchFactor(1, 1);
    33. splitter->setStretchFactor(2, 2);
    34. /*
    35. * [6]把分离器添加到窗口上
    36. * 创建一个layout
    37. * 添加组件的方式向layout添加分离器
    38. * 设置 layout 为程序的layout
    39. */
    40. QHBoxLayout *hlayout = new QHBoxLayout;
    41. hlayout->addWidget(splitter);
    42. m_widget->setContentsMargins(5, 5, 5, 5);
    43. m_widget->setLayout(hlayout);
    44. // 设置窗口大小
    45. //m_widget->setFixedSize(800, 200);
    46. this->setFixedSize(800, 200);
    47. }
    48. MainWindow::~MainWindow()
    49. {
    50. delete ui;
    51. }

    main.cpp

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

    3. 滚动区域

           当某个区域内的组件尺寸超过了预先设置好的范围时,可以使用QScrollArea提供的方法,生成滚动条,滚动显示组件内容。

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. namespace Ui {
    8. class MainWindow;
    9. }
    10. class MainWindow : public QWidget
    11. {
    12. Q_OBJECT
    13. public:
    14. explicit MainWindow(QWidget *parent = 0);
    15. ~MainWindow();
    16. private:
    17. Ui::MainWindow *ui;
    18. private:
    19. QLabel *scrollArealabel; // 声明一个标签
    20. };
    21. #endif // MAINWINDOW_H

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. MainWindow::MainWindow(QWidget *parent) :
    4. QWidget(parent)//,
    5. //ui(new Ui::MainWindow)
    6. {
    7. //ui->setupUi(this);
    8. // [1]创建一个标签
    9. scrollArealabel = new QLabel;
    10. // 设置标签的最小尺寸,非常重要,否则有可能无法正常显示滚动条
    11. scrollArealabel->setMinimumSize(500,500);
    12. // 设置标签显示的内容,随便写点东西
    13. scrollArealabel->setText("helo world ");
    14. // [2]创建滚动区域,设置滚动区域关联的对象
    15. QScrollArea *scrollArea = new QScrollArea;
    16. // 把标签加到滚动区域,使用 setWidget() 函数
    17. scrollArea->setWidget(scrollArealabel);
    18. // 设置滚动区域的背景色
    19. scrollArea->setBackgroundRole(QPalette::Dark);
    20. // [3]创建一个布局
    21. QHBoxLayout *hlayout = new QHBoxLayout;
    22. // 把滚动区域加到布局上
    23. hlayout->addWidget(scrollArea);
    24. // 使布局生效
    25. this->setLayout(hlayout);
    26. // 设置窗口的大小,比标签的最小尺寸小,这样能显示滚动区域
    27. this->setFixedSize(400,400);
    28. }
    29. MainWindow::~MainWindow()
    30. {
    31. delete ui;
    32. }

    main.cpp

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

    4. 停靠区域

           在Qt中,停靠窗口主要是指可以在QMainWindow中停靠或可以浮动的独立窗口。停靠窗口有四个区域,每个窗口可以有自己的标题栏,用户可以通过拖拽的方式移动窗口。浮动窗口可以在下图中的白色区域内移动,QDockWidget 这个类提供了关于停靠窗口的方法。

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. namespace Ui {
    10. class MainWindow;
    11. }
    12. class MainWindow : public QMainWindow
    13. {
    14. Q_OBJECT
    15. public:
    16. explicit MainWindow(QWidget *parent = 0);
    17. ~MainWindow();
    18. private:
    19. Ui::MainWindow *ui;
    20. private:
    21. QLabel *label; // 设置一个标签
    22. QPushButton *button1; // 按钮1
    23. QPushButton *button2; // 按钮2
    24. QPushButton *button3; // 按钮3
    25. QTextEdit *textEdit; // 文本框
    26. };
    27. #endif // MAINWINDOW_H

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. MainWindow::MainWindow(QWidget *parent) :
    4. QMainWindow(parent),
    5. ui(new Ui::MainWindow)
    6. {
    7. ui->setupUi(this);
    8. // [1]创建一个中心区域显示的文本框
    9. textEdit = new QTextEdit;
    10. textEdit->setText("main widget");
    11. // 设置文本框的大小
    12. textEdit->setFixedSize(300, 300);
    13. // 把文本框设置为程序中心窗口
    14. this->setCentralWidget(textEdit);
    15. // 设置组件与程序边框的距离
    16. this->setContentsMargins(15, 15, 15, 15);
    17. // 设置程序界面大小
    18. // this->setFixedSize(450, 330);
    19. // [2]创建组件
    20. label = new QLabel;
    21. label->setText("widget1");
    22. button1 = new QPushButton("aboutQt");
    23. button2 = new QPushButton("button2");
    24. button3 = new QPushButton("close");
    25. // 给两个按钮绑定槽,实现简单的功能
    26. connect(button1, SIGNAL(clicked()), qApp, SLOT(aboutQt()));// 关于QT
    27. connect(button3, SIGNAL(clicked()), this, SLOT(close())); // 关闭程序
    28. // [3]创建页面布局,用于标签和按钮的布局
    29. QVBoxLayout *docklayout_1 = new QVBoxLayout;
    30. // 向布局添加组件
    31. docklayout_1->addWidget(label);
    32. docklayout_1->addStretch();
    33. docklayout_1->addWidget(button1);
    34. QVBoxLayout *docklayout_2 = new QVBoxLayout;
    35. // 向布局添加组件
    36. docklayout_2->addStretch();
    37. docklayout_2->addWidget(button2);
    38. docklayout_2->addWidget(button3);
    39. // [4]创建窗口组件
    40. QWidget *widget1 = new QWidget;
    41. QWidget *widget2 = new QWidget;
    42. // [5]设置窗口组件的布局
    43. widget1->setLayout(docklayout_1);
    44. widget2->setLayout(docklayout_2);
    45. // [6]创建停靠窗口,并把上面两个窗口添加到停靠窗口中
    46. QDockWidget *dock = new QDockWidget(tr("myDockWindow1"), this);
    47. // 设置停靠区域
    48. dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    49. // 设置停靠窗口的属性
    50. dock->setFeatures(QDockWidget::DockWidgetMovable); //停靠窗口可移动属性
    51. // 窗口 widget1 设置为停靠窗口
    52. dock->setWidget(widget1);
    53. // 设置停靠窗口的大小
    54. // dock->setFixedSize(100,100);
    55. // 设置边框颜色
    56. dock->setStyleSheet((QString::fromUtf8("border:1px solid gray")));
    57. // 向程序主界面添加停靠窗口
    58. this->addDockWidget(Qt::RightDockWidgetArea, dock);
    59. QDockWidget *dock1 = new QDockWidget(tr("myDockWindow2"), this);
    60. // 设置停靠区域
    61. dock1->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
    62. // 设置停靠窗口的属性
    63. dock1->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有停靠窗口的全部特性
    64. // 窗口 widget2 设置为停靠窗口
    65. dock1->setWidget(widget2);
    66. // 设置停靠窗口的大小
    67. // dock1->setFixedSize(100,200);
    68. // 设置边框颜色
    69. dock1->setStyleSheet((QString::fromUtf8("border:1px solid gray")));
    70. // 向程序主界面添加停靠窗口
    71. this->addDockWidget(Qt::RightDockWidgetArea, dock1);
    72. // [7]设置两个停靠窗口的位置,垂直排列
    73. splitDockWidget(dock, dock1, Qt::Vertical);
    74. }
    75. MainWindow::~MainWindow()
    76. {
    77. delete ui;
    78. }

    main.cpp

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

    备注:参考文章

    Qt零基础系列06:如何进行界面布局管理 - 知乎

  • 相关阅读:
    MobileNetV1架构解析
    弘玑Cyclone成功入围《2022爱分析·流程挖掘厂商全景报告》,流程智能产品受到广泛关注
    Java多线程——Callable和future
    数据库系统原理与应用教程(059)—— MySQL 练习题:操作题 1-10(三)
    可图性判断(图论)
    设计模式之状态模式
    服装ERP软件首要的好处都有哪些?
    Spring的Bean加载流程
    matlab 设计BP神经网络对给出的英文字符分类
    14.TIM输出比较示例程序(PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机)
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/132679644