• QT基础入门——界面布局和常用控件(四)


    前言:

    所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt为我们应用程序界面开发提供的一系列的控件,下面我们介绍一下界面布局和最常用一些控件,所有控件的使用方法我们都可以通过帮助文档获取。

    目录

    一、布局管理器

    1.系统提供的布局控件

    2.利用widget做布局

     二、常用控件

    1.按钮组

    2. ListWidget列表容器

     3.QTreeWidget树控件

    (1)设置头:

    (2)创建根节点:

    (3)添加根节点到树控上:

    (4)添加子节点:

    4.QTableWidget 表格控件

    (1)设置列数:

    (2)设置水平表头:

    (3)设置行数:

    (4)设置正文:

    5.其他控件 

    (1)stackedWidget  栈控件

    (2)下拉框   

    (3)QLabel 显示图片

    (4)QLabel显示动图gif图片

    (5)完整代码 


    一、布局管理器

    1.系统提供的布局控件

    这4个为系统给我们提供的布局的控件,但是使用起来不是非常的灵活

    2.利用widget做布局

    第二种布局方式是利用控件里的widget来做布局,在Containers中

    在widget中的控件可以进行水平、垂直、栅格布局等操作,比较灵活。

    默认窗口和控件之间有9间隙,可以调整layoutLeftMargine 

    利用弹簧进行布局控制:

    再布局的同时我们需要灵活运用弹簧的特性让我们的布局更加的美观,下面是一个登陆窗口,利用widget可以搭建出如下登陆界面

     二、常用控件

    1.按钮组

    (1)  QpushButton:    常用按钮

    (2)  QToolButton:     工具按钮用于显示图片,如图想显示文字

                                       修改风格:   toolButtonstyle ,凸起风格autoRaise

    (3)   radioButton:       单选按钮,设置默认 u->rBtnMan->setChecked(true);

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. , ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. //设置单选按钮 男默认选中
    10. ui->rBtnMan->setChecked(true);
    11. connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
    12. qDebug() << "选中了女的";
    13. });
    14. }
    15. MainWindow::~MainWindow()
    16. {
    17. delete ui;
    18. }

    (4)   checkbox:           多选按钮,监听状态,2选中   1当选   0未选中

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. , ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. //多选按钮 2是选中,0是未选中
    10. connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){
    11. qDebug() << state;
    12. });
    13. }
    14. MainWindow::~MainWindow()
    15. {
    16. delete ui;
    17. }

    2. ListWidget列表容器

    1. QListWidgetItem * item 一行内容
    2. 可以利用addItems一次性添加整个诗内容
    3. 设置居中方式item->setTextAlignment(Qt::AlignHCenter);
    4. ui->listWidget ->addItem ( item )
    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. #include
    5. MainWindow::MainWindow(QWidget *parent)
    6. : QMainWindow(parent)
    7. , ui(new Ui::MainWindow)
    8. {
    9. ui->setupUi(this);
    10. //利用listWidget写诗
    11. QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
    12. //将一行诗放到listWidget控件中
    13. ui->listWidget->addItem(item);
    14. item->setTextAlignment(Qt::AlignHCenter);
    15. }
    16. MainWindow::~MainWindow()
    17. {
    18. delete ui;
    19. }

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. #include
    5. MainWindow::MainWindow(QWidget *parent)
    6. : QMainWindow(parent)
    7. , ui(new Ui::MainWindow)
    8. {
    9. ui->setupUi(this);
    10. //QList
    11. QStringList list;
    12. list << "锄禾日当午" << "旱地和下土" << "谁知盘中餐" << "粒粒皆辛苦";
    13. ui->listWidget->addItems(list);
    14. }
    15. MainWindow::~MainWindow()
    16. {
    17. delete ui;
    18. }

     3.QTreeWidget树控件

    (1)设置头:

            ui->treeWidget->setHeaderLabels(QStringList()<< "英雄"<< "英雄介绍");

    (2)创建根节点:

            QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<< "力量");

    (3)添加根节点到树控上:

            ui->treeWidget->addTopLevelItem(liItem);

    (4)添加子节点:

            liItem->addChild(l1);

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. , ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. //treeWidget树控件使用
    10. //设置水平头
    11. ui->treeWidget->setHeaderLabels(QStringList() << "英雄" << "英雄介绍");
    12. QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList() << "力量");
    13. QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList() << "敏捷");
    14. QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList() << "智力");
    15. //加载顶层的节点
    16. ui->treeWidget->addTopLevelItem(liItem);
    17. ui->treeWidget->addTopLevelItem(minItem);
    18. ui->treeWidget->addTopLevelItem(zhiItem);
    19. //追加子节点
    20. QStringList heroL1;
    21. heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成可观的范围输出";
    22. QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
    23. liItem->addChild(l1);
    24. QStringList heroL2;
    25. heroL2 << "船长" << "前排坦克,能肉能输出能控场的全能英雄";
    26. QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);
    27. liItem->addChild(l2);
    28. QStringList heroM1;
    29. heroM1 << "月骑" << "中排物理输出,可以使用分裂利刃攻击多个目标";
    30. QTreeWidgetItem * M1 = new QTreeWidgetItem(heroM1);
    31. minItem->addChild(M1);
    32. QStringList heroM2;
    33. heroM2 << "小鱼人" << "前排战士,擅长偷取敌人的属性来增强自身战力";
    34. QTreeWidgetItem * M2 = new QTreeWidgetItem(heroM2);
    35. minItem->addChild(M2);
    36. QStringList heroZ1;
    37. heroZ1 << "死灵法师" << "前排法师坦克,魔法抗性较高,拥有治疗技能";
    38. QTreeWidgetItem * Z1 = new QTreeWidgetItem(heroZ1);
    39. zhiItem->addChild(Z1);
    40. QStringList heroZ2;
    41. heroZ2 << "巫医" << "后排辅助法师,可以使用奇特的巫术诅咒敌人与治疗队友";
    42. QTreeWidgetItem * Z2 = new QTreeWidgetItem(heroZ2);
    43. zhiItem->addChild(Z2);
    44. }
    45. MainWindow::~MainWindow()
    46. {
    47. delete ui;
    48. }

    4.QTableWidget 表格控件

    (1)设置列数:

            ui->tableWidget->setColumnCount(3);

    (2)设置水平表头:

            ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");

    (3)设置行数:

            ui->tableWidget->setRowCount(5);

    (4)设置正文:

            ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. , ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. //tableWidget表格控件使用
    10. //设置列数
    11. ui->tableWidget->setColumnCount(3);
    12. //设置水平表头
    13. ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");
    14. //设置行数
    15. ui->tableWidget->setRowCount(5);
    16. //设置正文
    17. // ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));
    18. // ui->tableWidget->setItem(0,1, new QTableWidgetItem("男"));
    19. // ui->tableWidget->setItem(0,2, new QTableWidgetItem("18"));
    20. QStringList nameList;
    21. nameList << "亚瑟" << "赵云" << "张飞" << "关羽" << "花木兰";
    22. QList sexList;
    23. sexList << "男" << "男" << "男" << "男" << "女";
    24. //QList等价于QStringList
    25. for(int i = 0;i < 5;i++)
    26. {
    27. int col = 0;
    28. ui->tableWidget->setItem(i,col++, new QTableWidgetItem(nameList[i]));
    29. ui->tableWidget->setItem(i,col++, new QTableWidgetItem(sexList.at(i)));
    30. //int 转QString
    31. ui->tableWidget->setItem(i,col++, new QTableWidgetItem(QString::number(i+18)));
    32. }
    33. }
    34. MainWindow::~MainWindow()
    35. {
    36. delete ui;
    37. }

    5.其他控件 

    (1)stackedWidget  栈控件

    ui->stackedWidget->setCurrentIndex(1);

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //栈控件使用
    10. //设置默认定位页面
    11. ui->stackedWidget->setCurrentIndex(0);
    12. //btn1按钮
    13. connect(ui->btn1,&QPushButton::clicked,[=](){
    14. ui->stackedWidget->setCurrentIndex(1);
    15. });
    16. //btn2按钮
    17. connect(ui->btn2,&QPushButton::clicked,[=](){
    18. ui->stackedWidget->setCurrentIndex(2);
    19. });
    20. //btn3按钮
    21. connect(ui->btn3,&QPushButton::clicked,[=](){
    22. ui->stackedWidget->setCurrentIndex(0);
    23. });
    24. }
    25. Widget::~Widget()
    26. {
    27. delete ui;
    28. }

    (2)下拉框   

     ui->comboBox->addItem("奔驰");

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //下拉框
    10. ui->comboBox->addItem("奔驰");
    11. ui->comboBox->addItem("宝马");
    12. ui->comboBox->addItem("拖拉机");
    13. //点击按钮 选中宝马
    14. connect(ui->btnt,&QPushButton::clicked,[=](){
    15. //ui->comboBox->setCurrentIndex(2);
    16. ui->comboBox->setCurrentText("宝马");
    17. });
    18. }
    19. Widget::~Widget()
    20. {
    21. delete ui;
    22. }

    (3)QLabel 显示图片

    ui->lbl_Image->setPixmap(QPixmap(":/Image/butterfly.png"))

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //利用QLabel显示图片
    10. ui->lbl_image->setPixmap(QPixmap(":/Image/butterfly.png"));
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }

    (4)QLabel显示动图gif图片

    ui->lbl_movie->setMovie(movie);

    movie->start();

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //利用QLabel显示动态图片
    10. QMovie * movie = new QMovie(":/Image/mario.gif");
    11. ui->lbl_movie->setMovie(movie);
    12. //播放动图
    13. movie->start();
    14. }
    15. Widget::~Widget()
    16. {
    17. delete ui;
    18. }

    (5)完整代码 

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //栈控件使用
    10. //设置默认定位页面
    11. ui->stackedWidget->setCurrentIndex(0);
    12. //btn1按钮
    13. connect(ui->btn1,&QPushButton::clicked,[=](){
    14. ui->stackedWidget->setCurrentIndex(1);
    15. });
    16. //btn2按钮
    17. connect(ui->btn2,&QPushButton::clicked,[=](){
    18. ui->stackedWidget->setCurrentIndex(2);
    19. });
    20. //btn3按钮
    21. connect(ui->btn3,&QPushButton::clicked,[=](){
    22. ui->stackedWidget->setCurrentIndex(0);
    23. });
    24. //下拉框
    25. ui->comboBox->addItem("奔驰");
    26. ui->comboBox->addItem("宝马");
    27. ui->comboBox->addItem("拖拉机");
    28. //点击按钮 选中宝马
    29. connect(ui->btnt,&QPushButton::clicked,[=](){
    30. //ui->comboBox->setCurrentIndex(2);
    31. ui->comboBox->setCurrentText("宝马");
    32. });
    33. //利用QLabel显示图片
    34. ui->lbl_image->setPixmap(QPixmap(":/Image/butterfly.png"));
    35. //利用QLabel显示动态图片
    36. QMovie * movie = new QMovie(":/Image/mario.gif");
    37. ui->lbl_movie->setMovie(movie);
    38. //播放动图
    39. movie->start();
    40. }
    41. Widget::~Widget()
    42. {
    43. delete ui;
    44. }

     

    三、自定义控件

    在搭建Qt窗口界面的时候,在一个项目中很多窗口,或者是窗口中的某个模块会被经常性的重复使用。一般遇到这种情况我们都会将这个窗口或者模块拿出来做成一个独立的窗口类,以备以后重复使用。

    在使用Qt的ui文件搭建界面的时候,工具栏栏中只为我们提供了标准的窗口控件,如果我们想使用自定义控件怎么办?

    我们从QWidget派生出一个类SmallWidget,实现了一个自定窗口

    1.samllWidget.h

    提供 getNum  和 setNum对外接口

    1. #ifndef SAMLLWIDGET_H
    2. #define SAMLLWIDGET_H
    3. #include
    4. namespace Ui {
    5. class samllWidget;
    6. }
    7. class samllWidget : public QWidget
    8. {
    9. Q_OBJECT
    10. public:
    11. explicit samllWidget(QWidget *parent = nullptr);
    12. ~samllWidget();
    13. //设置数字
    14. void setNum(int num);
    15. //获取数字
    16. int getNum();
    17. private:
    18. Ui::samllWidget *ui;
    19. };
    20. #endif // SAMLLWIDGET_H

    2.samllWidget.cpp

    实现功能,改变数字,滑动条跟着移动 ,信号槽监听

    1. #include "samllwidget.h"
    2. #include "ui_samllwidget.h"
    3. samllWidget::samllWidget(QWidget *parent) :
    4. QWidget(parent),
    5. ui(new Ui::samllWidget)
    6. {
    7. ui->setupUi(this);
    8. //QSpinBox移动 QSlider跟着移动
    9. void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged;
    10. connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
    11. // QSlider滑动 QSpinBox数字跟着改变
    12. connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
    13. }
    14. //设置数字
    15. void samllWidget::setNum(int num)
    16. {
    17. ui->spinBox->setValue(num);
    18. }
    19. //获取数字
    20. int samllWidget::getNum()
    21. {
    22. return ui->spinBox->value();
    23. }
    24. samllWidget::~samllWidget()
    25. {
    26. delete ui;
    27. }

    3.samllWidget.ui 

    .ui中 设计 QSpinBox和QSlider 两个控件

    Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升

    弹出提升窗口部件对话框

    添加要提升的类的名字,然后选择 添加

    添加之后,类名会显示到上边的列表框中,然后单击提升按钮,完成操作.

    我们可以看到, 这个窗口对应的类从原来的QWidget变成了SmallWidget

    再次运行程序,这个widget_3中就能显示出我们自定义的窗口了.

  • 相关阅读:
    网页排版和代码优化,求带我看看代码
    R语言——条形图数据可视化的多种方式
    PMP课程笔记:第13章 项目相关方管理
    性能优化篇(二) 静态合批步骤与所有注意事项\游戏运行时使用代码启动静态合批
    【重识云原生】第六章容器6.1.8节——Docker核心技术UnionFS
    建设网站制作公司的选择标准是什么?
    K8S集群进行分布式负载测试
    Bean 作用域和生命周期
    网络请求urllib库使用总结
    场效应管Mosfet之雷卯Leiditech对应英飞凌Infineon
  • 原文地址:https://blog.csdn.net/m0_63168877/article/details/133634525