• Qt中常用容器组控件介绍和实操


    目录

    常用容器组控件(Containers):

    1.Group Box

    2.Scroll Area

    3.Tab Widget

    4.Frame 

    5.Dock Widget


    常用容器组控件(Containers):

    控件名称依次解释如下(常用的用红色标出):

    • Group Box: 组合框: 提供带有标题的组合框框架
    • Scroll Area : 滚动区域
    • Tool Box: 工具箱
    • Tab Widget: 标签小部件
    • Stacked Widget: 堆叠部件
    • Frame : 框架
    • Widget: 小部件
    • MdiArea : MDI 区域
    • Dock Widget: 停靠窗体部件
    • QAxWidget: 封装 Flash 的 ActiveX 控件
    1.Group Box

    QGroupBox是一个QWidget的子类,用于显示一组相关的窗口部件。QGroupBox可以带有一个标题,它通常用于对窗口部件进行分组,以便更好地组织它们。QGroupBox还可以用于设置可用性、布局和样式表。

    案例分析:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. class Widget : public QWidget
    5. {
    6. Q_OBJECT
    7. public:
    8. Widget(QWidget *parent = nullptr);
    9. ~Widget();
    10. };
    11. #endif // WIDGET_H

    main.cpp

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

    widget.cpp

    1. #include "widget.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include // 可以在水平方向和垂直方向进行排列的控件,QHBoxLayout/QVBoxLayout所继承
    7. #include
    8. #include
    9. Widget::Widget(QWidget *parent)
    10. : QWidget(parent)
    11. {
    12. this->setWindowTitle("QGroupBox");
    13. // 组合框1:gpb_1
    14. QGroupBox *gpb_1 = new QGroupBox("单选按钮组1");
    15. QRadioButton *rbtn_1=new QRadioButton("RadioButton1");
    16. QRadioButton *rbtn_2=new QRadioButton("RadioButton2");
    17. QRadioButton *rbtn_3=new QRadioButton("RadioButton3");
    18. QVBoxLayout *vbly1 = new QVBoxLayout;
    19. vbly1->addWidget(rbtn_1);
    20. vbly1->addWidget(rbtn_2);
    21. vbly1->addWidget(rbtn_3);
    22. gpb_1->setLayout(vbly1);
    23. // 组合框2:gpb_2
    24. QGroupBox *gpb_2=new QGroupBox("复选按钮组2");
    25. QCheckBox *cbx1=new QCheckBox("checkbox1");
    26. QCheckBox *cbx2=new QCheckBox("checkbox2");
    27. QCheckBox *cbx3=new QCheckBox("checkbox3");
    28. // 全选的复选框能实时呈现(全选、半选、未选)
    29. // cbx2->setTristate(true); // 设置是否支持半选状态,默认不支持半选态
    30. cbx2->setChecked(true);
    31. QVBoxLayout *vbly2 = new QVBoxLayout;
    32. vbly2->addWidget(cbx1);
    33. vbly2->addWidget(cbx2);
    34. vbly2->addWidget(cbx3);
    35. gpb_2->setLayout(vbly2);
    36. // 组合框3:gpb_3
    37. QGroupBox *gpb_3=new QGroupBox("单选按钮和复选按钮组3");
    38. gpb_3->setCheckable(true);
    39. QRadioButton *rbtn_31=new QRadioButton("RadioButton31");
    40. QRadioButton *rbtn_32=new QRadioButton("RadioButton32");
    41. QRadioButton *rbtn_33=new QRadioButton("RadioButton33");
    42. QCheckBox *cbx4=new QCheckBox("checkbox4");
    43. cbx4->setChecked(true);
    44. QVBoxLayout *vbly3=new QVBoxLayout;
    45. vbly3->addWidget(rbtn_31);
    46. vbly3->addWidget(rbtn_32);
    47. vbly3->addWidget(rbtn_33);
    48. vbly3->addWidget(cbx4);
    49. gpb_3->setLayout(vbly3);
    50. // 组合框4:gpb_4
    51. QGroupBox *gpb_4=new QGroupBox("综合按钮组4");
    52. gpb_4->setCheckable(true);
    53. gpb_4->setChecked(true);
    54. QPushButton *pbtn_4=new QPushButton("PushButton4");
    55. QPushButton *pbtn_5=new QPushButton("PushButton5");
    56. pbtn_5->setCheckable(true); // 设置按钮可以按下去
    57. pbtn_5->setChecked(true); // 设置按钮5为默认按钮
    58. QPushButton *pbtn_6=new QPushButton("PushButton6");
    59. // 命令按钮6添加子菜单
    60. QMenu *mu=new QMenu(this);
    61. mu->addAction("King");
    62. mu->addAction("Darren");
    63. mu->addAction("Mark");
    64. mu->addAction("Vico");
    65. pbtn_6->setMenu(mu);
    66. QVBoxLayout *vbly4=new QVBoxLayout;
    67. vbly4->addWidget(pbtn_4);
    68. vbly4->addWidget(pbtn_5);
    69. vbly4->addWidget(pbtn_6);
    70. gpb_4->setLayout(vbly4);
    71. QGridLayout *gdlyout=new QGridLayout;
    72. gdlyout->addWidget(gpb_1,0,0,1,1);
    73. gdlyout->addWidget(gpb_2,0,1,1,1);
    74. gdlyout->addWidget(gpb_3,1,0,1,1);
    75. gdlyout->addWidget(gpb_4,1,1,1,1);
    76. this->setLayout(gdlyout);
    77. }
    78. Widget::~Widget()
    79. {
    80. }

    编译执行结果:

    2.Scroll Area

    QScrollArea:可以将某个控件包含在一个滚动区域内,当控件内容超出显示区域时,用户可以通过滚动条来查看所有内容。

    首先添加一张图片

    显示一张图片滑动案例分析:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. class Widget : public QWidget
    5. {
    6. Q_OBJECT
    7. public:
    8. Widget(QWidget *parent = nullptr);
    9. ~Widget();
    10. };
    11. #endif // WIDGET_H

    main.cpp

    1. #include "widget.h"
    2. #include
    3. #include
    4. #include // QScrollArea当中有很多功能继承来自于QAbstractScrollArea
    5. #include
    6. int main(int argc, char *argv[])
    7. {
    8. QApplication a(argc, argv);
    9. Widget w;
    10. w.resize(300,200);
    11. QLabel *qljpg=new QLabel;
    12. qljpg->setScaledContents(true);
    13. QImage imagejpg(":/new/prefix1/image01/1.png");
    14. qljpg->setPixmap(QPixmap::fromImage(imagejpg));
    15. QScrollArea *sArea=new QScrollArea;
    16. // 居中
    17. sArea->setAlignment(Qt::AlignCenter);
    18. // 根据窗口比例显示
    19. // sArea->setWidgetResizable(true);
    20. sArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // 水平滑动
    21. sArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // 垂直滑动
    22. sArea->setWidget(qljpg);
    23. QGridLayout *glayout=new QGridLayout;
    24. glayout->addWidget(sArea);
    25. w.setLayout(glayout);
    26. w.show();
    27. return a.exec();
    28. }

    widget.cpp

    1. #include "widget.h"
    2. Widget::Widget(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. }
    6. Widget::~Widget()
    7. {
    8. }

    编译执行结果(可水平和垂直滑动图片):

    3.Tab Widget

    QTabWidget:可以将多个控件以选项卡的形式展示,用户可以点击不同的选项卡来切换控件。

    案例分析:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. class Widget : public QWidget
    11. {
    12. Q_OBJECT
    13. public:
    14. Widget(QWidget *parent = nullptr);
    15. ~Widget();
    16. private:
    17. QTabWidget *tabWidgetUI;
    18. private slots:
    19. void MsgCommit();
    20. };
    21. #endif // WIDGET_H

    main.cpp

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

    widget.cpp

    1. #include "widget.h"
    2. Widget::Widget(QWidget *parent)
    3. : QWidget(parent)
    4. {
    5. this->setWindowTitle("Tab Widget");
    6. this->setGeometry(300,200,600,400);
    7. tabWidgetUI=new QTabWidget(this);
    8. tabWidgetUI->setGeometry(20,20,560,360);
    9. tabWidgetUI->show();
    10. bool m_showtabwidgetui1=true;
    11. bool m_showtabwidgetui2=true;
    12. // bool m_showtabwidgetui3=false;
    13. // bool m_showtabwidgetui4=false;
    14. if(m_showtabwidgetui1){
    15. QWidget *qwidget1=new QWidget();
    16. tabWidgetUI->addTab(qwidget1,"进程");
    17. QGridLayout *glayout=new QGridLayout();
    18. QLabel *lab1=new QLabel("请选择文件及文件夹:");
    19. QLineEdit *ledit1=new QLineEdit();
    20. QPushButton *pbt1=new QPushButton("消息框...");
    21. connect(pbt1,SIGNAL(clicked(bool)),this,SLOT(MsgCommit()));
    22. glayout->addWidget(lab1,0,0);
    23. glayout->addWidget(ledit1,0,1);
    24. glayout->addWidget(pbt1,0,2);
    25. qwidget1->setLayout(glayout);
    26. }
    27. if(m_showtabwidgetui2){
    28. QWidget *qwidget2=new QWidget();
    29. tabWidgetUI->addTab(qwidget2,"性能");
    30. }
    31. }
    32. Widget::~Widget()
    33. {
    34. }
    35. void Widget::MsgCommit()
    36. {
    37. QMessageBox::information(NULL,"testing","QMessageBox:命令按钮测试成功!",QMessageBox::Ok);
    38. }

    编译执行结果:

    4.Frame 

    QFrame是一个QWidget的子类,可以用作容器,用于显示其他窗口部件或绘制简单的框架。QFrame可以用于创建矩形、线条和点等几何形状。QFrame还可以用于设置可用性、布局和样式表。

    先进行ui设计两个框架:

    再进行代码编写:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. QT_BEGIN_NAMESPACE
    5. namespace Ui { class Widget; }
    6. QT_END_NAMESPACE
    7. class Widget : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. Widget(QWidget *parent = nullptr);
    12. ~Widget();
    13. private:
    14. Ui::Widget *ui;
    15. };
    16. #endif // WIDGET_H

    main.cpp

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

    widget.cpp 

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. setWindowTitle("Frame");
    9. ui->frame_1->setStyleSheet("background-color:yellow");
    10. ui->frame_2->setStyleSheet("background-color:black");
    11. ui->frame_1->setLineWidth(1);
    12. ui->frame_1->setMidLineWidth(1);
    13. ui->frame_1->setFrameShape(QFrame::Box);
    14. ui->frame_1->setFrameShadow(QFrame::Raised);
    15. ui->frame_2->setLineWidth(0);
    16. ui->frame_2->setMidLineWidth(1);
    17. ui->frame_2->setFrameShape(QFrame::Box);
    18. ui->frame_2->setFrameShadow(QFrame::Sunken);
    19. }
    20. Widget::~Widget()
    21. {
    22. delete ui;
    23. }

    编译执行结果:

    5.Dock Widget

    QDockWidget是Qt框架中的一个小部件,用于创建可停靠的窗口。它提供了一个可停靠的窗口,其中包含了一个主要的小部件和一些辅助的小部件。它可以以四个停靠区域的任何一个(上、下、左、右)停靠到主窗口周围,也可以脱靶,浮动在主窗口之外。

    QDockWidget的主要特点是:

    1. 可以独立于主窗口停靠和浮动。

    2. 可以在主窗口周围的四个方向停靠。

    3. 可以包含其他的子部件,方便组织用户界面。

    4. 可以通过API进行动态的操作,例如添加、移除、重新排列等。

    QDockWidget的用途非常广泛,无论是作为工具条、面板、属性编辑器、日志查看器等都非常适合。在Qt中,使用QDockWidget可以轻松地实现各种类型的可停靠窗口。

    案例分析:

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. QT_BEGIN_NAMESPACE
    5. namespace Ui { class MainWindow; }
    6. QT_END_NAMESPACE
    7. class MainWindow : public QMainWindow
    8. {
    9. Q_OBJECT
    10. public:
    11. MainWindow(QWidget *parent = nullptr);
    12. ~MainWindow();
    13. private:
    14. Ui::MainWindow *ui;
    15. };
    16. #endif // MAINWINDOW_H

    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. }

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include // 只能停靠在mainwindow里
    4. #include
    5. #include
    6. #include
    7. #include
    8. MainWindow::MainWindow(QWidget *parent)
    9. : QMainWindow(parent)
    10. , ui(new Ui::MainWindow)
    11. {
    12. ui->setupUi(this);
    13. setWindowTitle("QDockWidget");
    14. QDockWidget *dw=new QDockWidget("停靠窗口部件测试:Dock Widget-->Vico",this);
    15. // 设置颜色
    16. QPalette pal;
    17. pal.setColor(QPalette::Background,Qt::cyan);
    18. dw->setAutoFillBackground(true);
    19. dw->setPalette(pal);
    20. // 学历层次
    21. QLabel *lab=new QLabel("学历层次:");
    22. QComboBox *cbx=new QComboBox();
    23. cbx->addItem("小学");
    24. cbx->addItem("初中");
    25. cbx->addItem("高中");
    26. cbx->addItem("专科");
    27. cbx->addItem("本科");
    28. cbx->addItem("硕士研究生");
    29. cbx->addItem("博士研究生");
    30. QPushButton *pbt1=new QPushButton("清华大学");
    31. QPushButton *pbt2=new QPushButton("北京大学");
    32. // 通过栅格布局(网格布局)
    33. QGridLayout *glayout=new QGridLayout();
    34. glayout->addWidget(lab,0,0,1,1);
    35. glayout->addWidget(cbx,0,1,1,1);
    36. glayout->addWidget(pbt1,1,0,1,1);
    37. glayout->addWidget(pbt2,1,1,1,1);
    38. glayout->setHorizontalSpacing(10);
    39. glayout->setVerticalSpacing(10);
    40. glayout->setContentsMargins(20,20,20,20);
    41. QWidget *wgt=new QWidget();
    42. wgt->setLayout(glayout);
    43. dw->setWidget(wgt);
    44. dw->setMaximumSize(300,300);
    45. }
    46. MainWindow::~MainWindow()
    47. {
    48. delete ui;
    49. }

    编译执行结果:

  • 相关阅读:
    实现α-β剪枝的算法实例
    Triage沙箱监控
    这一定是前端导出Excel界的天花板~
    第三方资源配置管理(九)
    Vue绑定style和class 对象写法
    一台新电脑进行 Web 页面请求的历程
    Nginx快速入门及配置文件结构
    A Philosophy of Software Design读书笔记——设计两次&写注释
    element-ui侧边栏:default-openeds
    python的破解重构加密
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/133692080