找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2453|回复: 17

C/C++ Qt StatusBar 底部状态栏应用

 火... [复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:1
  • 打卡总奖励:7791
  • 最近打卡:2025-12-13 17:25:16

2540

主题

1355

回帖

2万

积分

管理员

积分
21304
发表于 2022-7-10 12:04:43 | 显示全部楼层 |阅读模式
Qt窗体中默认会附加一个QstatusBar组件,状态栏组件位于主窗体的最下方,其作用是提供一个工具提示功能,当程序中有提示信息是可以动态的显示在这个区域内,状态栏组件内可以增加任何Qt中的通用组件,只需要通过addWidget函数动态追加即可引入到底部,底部状态栏在实际开发中应用非常普遍,以下代码是对该组件基本使用方法的总结。
首先我们通过new新增3个QLabel组件,并将该组件依次排列在底部状态栏内,实现代码如下所示:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QLabel>

  4. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  5. {
  6.     ui->setupUi(this);

  7.     // 初始化状态栏
  8.     QLabel *labCellIndex = new QLabel("当前坐标: 0.0",this);
  9.     labCellIndex->setMinimumWidth(250);

  10.     QLabel *labCellType=new QLabel("单元格类型: null",this);
  11.     labCellType->setMinimumWidth(200);

  12.     QLabel *labStudID=new QLabel("学生ID: 0",this);
  13.     labStudID->setMinimumWidth(200);

  14.     // 将初始化的标签添加到底部状态栏上
  15.     ui->statusBar->addWidget(labCellIndex);
  16.     ui->statusBar->addWidget(labCellType);
  17.     ui->statusBar->addWidget(labStudID);
  18. }

  19. MainWindow::~MainWindow()
  20. {
  21.     delete ui;
  22. }
复制代码

运行代码效果如下:
QLabel组件除了可以增加提示信息以外,通过设置setOpenExternalLinks可以将这个组件设置为以链接形式出现,有利于我们增加网页跳转等功能。
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QLabel>

  4. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  5. {
  6.     ui->setupUi(this);

  7.     // 隐藏状态栏下方三角形
  8.     ui->statusBar->setSizeGripEnabled(false);

  9.     // 新增标签栏
  10.     QLabel *label_url = new QLabel(this);
  11.     QLabel *label_about = new QLabel(this);

  12.     // 配置连接
  13.     label_url->setFrameStyle(QFrame::Box | QFrame::Sunken);
  14.     label_url->setText(tr("<a href="https://lyshark.cnblogs.com">访问主页</a>"));
  15.     label_url->setOpenExternalLinks(true);

  16.     label_about->setFrameStyle(QFrame::Box | QFrame::Sunken);
  17.     label_about->setText(tr("<a href="https://lyshark.cnblogs.com">关于我</a>"));
  18.     label_about->setOpenExternalLinks(true);

  19.     // 将信息增加到底部(永久添加)
  20.     ui->statusBar->addPermanentWidget(label_url);
  21.     ui->statusBar->addPermanentWidget(label_about);
  22. }

  23. MainWindow::~MainWindow()
  24. {
  25.     delete ui;
  26. }
复制代码

运行代码效果如下:
同理,只要是通用组件都可以被安置到底部菜单栏,如果我们需要增加进度条组件只需要这样写:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QLabel>
  4. #include <QProgressBar>

  5. QProgressBar *pro;

  6. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  7. {
  8.     ui->setupUi(this);

  9.     pro = new QProgressBar(this);

  10.     // 自动计算
  11.     ui->statusBar->addPermanentWidget(pro, 1);

  12.     // 设置进度是否显示
  13.     pro->setTextVisible(true);

  14.     // 设置初始化进度位置
  15.     pro->setValue(0);
  16. }

  17. MainWindow::~MainWindow()
  18. {
  19.     delete ui;
  20. }

  21. void MainWindow::on_pushButton_clicked()
  22. {
  23.     qint32 count = pro->value();
  24.     count = count +10;
  25.     pro->setValue(count);
  26. }
复制代码

运行代码效果如下:
接着我们增加一个tablewidget并初始化参数,tableWidget组件存在一个on_tableWidget_currentCellChanged属性,该属性的作用是,只要Table表格存在变化则会触发,当用户选择不同的表格,我们可以将当前表格行列自动设置到状态栏中,从而实现同步状态栏消息提示,起到时刻动态显示的作用。
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QLabel>
  4. #include <QTableWidget>
  5. #include <QTableWidgetItem>

  6. QLabel *labCellIndex;

  7. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  8. {
  9.     ui->setupUi(this);

  10. // ------------------------------------------------------------------------------------
  11. // 初始化状态栏
  12.     labCellIndex = new QLabel("当前坐标: 0.0",this);
  13.     labCellIndex->setMinimumWidth(250);

  14.     // 将初始化的标签添加到底部状态栏上
  15.     ui->statusBar->addWidget(labCellIndex);

  16. // ------------------------------------------------------------------------------------
  17. // 填充数据,对表格进行初始化操作
  18.     QStringList header;
  19.     header << "姓名" << "性别" << "年龄";

  20.     ui->tableWidget->setColumnCount(header.size());                        // 设置表格的列数
  21.     ui->tableWidget->setHorizontalHeaderLabels(header);                    // 设置水平头
  22.     ui->tableWidget->setRowCount(5);                                       // 设置总行数
  23.     ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);   // 设置表结构默认不可编辑

  24.     // 填充数据
  25.     QStringList NameList;
  26.     NameList << "lyshark A" << "lyshark B" << "lyshark C";

  27.     QStringList SexList;
  28.     SexList << "男" << "男" << "女";

  29.     qint32 AgeList[3] = {22,23,43};

  30.     // 针对获取元素使用 NameList[x] 和使用 NameList.at(x)效果相同
  31.     for(int x=0;x< 3;x++)
  32.     {
  33.         int col =0;
  34.         // 添加姓名
  35.         ui->tableWidget->setItem(x,col++,new QTableWidgetItem(NameList[x]));
  36.         // 添加性别
  37.         ui->tableWidget->setItem(x,col++,new QTableWidgetItem(SexList.at(x)));
  38.         // 添加年龄
  39.         ui->tableWidget->setItem(x,col++,new QTableWidgetItem( QString::number(AgeList[x]) ) );
  40.     }
  41. }

  42. // 当前选择单元格发生变化时触发响应事件,也就是将底部状态栏标签设置
  43. // https://www.cnblogs.com/lyshark
  44. void MainWindow::on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
  45. {
  46.     Q_UNUSED(previousRow);
  47.     Q_UNUSED(previousColumn);

  48.     // 显示行与列的变化数值
  49.     //std::cout << "currentRow = " << currentRow << " currentColumn = " << currentColumn << std::endl;
  50.     //std::cout << "pre Row = " << previousRow << " pre Column = " << previousColumn << std::endl;

  51.     // 获取当前单元格的Item
  52.     QTableWidgetItem *item = ui->tableWidget->item(currentRow,currentColumn);
  53.     if(item == NULL)
  54.     return;

  55.     // 设置单元格坐标
  56.     labCellIndex->setText(QString::asprintf("当前坐标: %d 行 | %d 列",currentRow,currentColumn));
  57. }

  58. MainWindow::~MainWindow()
  59. {
  60.     delete ui;
  61. }
复制代码
运行代码效果如下:

工控课堂 www.gkket.com

0

主题

86

回帖

128

积分

新手上路

积分
128
发表于 2025-11-14 10:46:17 | 显示全部楼层
同款经历!简直是世另我
工控课堂 www.gkket.com

0

主题

72

回帖

99

积分

新手上路

积分
99
发表于 2025-11-14 11:20:04 | 显示全部楼层
这评论区卧虎藏龙,个个都是人才!
工控课堂 www.gkket.com

0

主题

71

回帖

100

积分

新手上路

积分
100
发表于 2025-11-14 11:24:28 | 显示全部楼层
我先占个楼,等下再慢慢看~
工控课堂 www.gkket.com

0

主题

93

回帖

137

积分

新手上路

积分
137
发表于 2025-11-14 11:30:31 | 显示全部楼层
楼主辛苦啦,期待下一篇分享!
工控课堂 www.gkket.com

0

主题

41

回帖

47

积分

新手上路

积分
47
发表于 2025-11-14 11:30:43 | 显示全部楼层
蹲一波同款,有没有姐妹 / 兄弟推荐?
工控课堂 www.gkket.com

0

主题

76

回帖

108

积分

新手上路

积分
108
发表于 2025-11-14 11:30:49 | 显示全部楼层
楼主辛苦啦,期待下一篇分享
工控课堂 www.gkket.com

0

主题

70

回帖

108

积分

新手上路

积分
108
发表于 2025-11-14 11:37:15 | 显示全部楼层
原来还有这种操作,长见识了!
工控课堂 www.gkket.com

0

主题

76

回帖

233

积分

注册会员

积分
233
发表于 2025-11-14 11:39:07 | 显示全部楼层
占个楼慢慢看,先马克一下
楼主辛苦啦,期待下一篇分享
工控课堂 www.gkket.com

0

主题

104

回帖

170

积分

新手上路

积分
170
发表于 2025-11-14 11:42:31 | 显示全部楼层
评论区人才辈出,笑到停不下来😂
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 03:56 , Processed in 0.083566 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表