qt窗体中默认会附加一个qstatusbar组件,状态栏组件位于主窗体的最下方,其作用是提供一个工具提示功能,当程序中有提示信息是可以动态的显示在这个区域内,状态栏组件内可以增加任何qt中的通用组件,只需要通过addwidget
函数动态追加即可引入到底部,底部状态栏在实际开发中应用非常普遍,以下代码是对该组件基本使用方法的总结。
首先我们通过new
新增3个qlabel
组件,并将该组件依次排列在底部状态栏内,实现代码如下所示:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qlabel>
mainwindow::mainwindow(qwidget *parent) : qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
// 初始化状态栏
qlabel *labcellindex = new qlabel("当前坐标: 0.0",this);
labcellindex->setminimumwidth(250);
qlabel *labcelltype=new qlabel("单元格类型: null",this);
labcelltype->setminimumwidth(200);
qlabel *labstudid=new qlabel("学生id: 0",this);
labstudid->setminimumwidth(200);
// 将初始化的标签添加到底部状态栏上
ui->statusbar->addwidget(labcellindex);
ui->statusbar->addwidget(labcelltype);
ui->statusbar->addwidget(labstudid);
}
mainwindow::~mainwindow()
{
delete ui;
}
运行代码效果如下:
qlabel组件除了可以增加提示信息以外,通过设置setopenexternallinks
可以将这个组件设置为以链接形式出现,有利于我们增加网页跳转等功能。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qlabel>
mainwindow::mainwindow(qwidget *parent) : qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
// 隐藏状态栏下方三角形
ui->statusbar->setsizegripenabled(false);
// 新增标签栏
qlabel *label_url = new qlabel(this);
qlabel *label_about = new qlabel(this);
// 配置连接
label_url->setframestyle(qframe::box | qframe::sunken);
label_url->settext(tr("<a href=\"https://lyshark.cnblogs.com\">访问主页</a>"));
label_url->setopenexternallinks(true);
label_about->setframestyle(qframe::box | qframe::sunken);
label_about->settext(tr("<a href=\"https://lyshark.cnblogs.com\">关于我</a>"));
label_about->setopenexternallinks(true);
// 将信息增加到底部(永久添加)
ui->statusbar->addpermanentwidget(label_url);
ui->statusbar->addpermanentwidget(label_about);
}
mainwindow::~mainwindow()
{
delete ui;
}
运行代码效果如下:
同理,只要是通用组件都可以被安置到底部菜单栏,如果我们需要增加进度条组件只需要这样写:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qlabel>
#include <qprogressbar>
qprogressbar *pro;
mainwindow::mainwindow(qwidget *parent) : qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
pro = new qprogressbar(this);
// 自动计算
ui->statusbar->addpermanentwidget(pro, 1);
// 设置进度是否显示
pro->settextvisible(true);
// 设置初始化进度位置
pro->setvalue(0);
}
mainwindow::~mainwindow()
{
delete ui;
}
void mainwindow::on_pushbutton_clicked()
{
qint32 count = pro->value();
count = count +10;
pro->setvalue(count);
}
运行代码效果如下:
接着我们增加一个tablewidget
并初始化参数,tablewidget组件存在一个on_tablewidget_currentcellchanged
属性,该属性的作用是,只要table表格存在变化则会触发,当用户选择不同的表格,我们可以将当前表格行列自动设置到状态栏中,从而实现同步状态栏消息提示,起到时刻动态显示的作用。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qlabel>
#include <qtablewidget>
#include <qtablewidgetitem>
qlabel *labcellindex;
mainwindow::mainwindow(qwidget *parent) : qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
// ------------------------------------------------------------------------------------
// 初始化状态栏
labcellindex = new qlabel("当前坐标: 0.0",this);
labcellindex->setminimumwidth(250);
// 将初始化的标签添加到底部状态栏上
ui->statusbar->addwidget(labcellindex);
// ------------------------------------------------------------------------------------
// 填充数据,对表格进行初始化操作
qstringlist header;
header << "姓名" << "性别" << "年龄";
ui->tablewidget->setcolumncount(header.size()); // 设置表格的列数
ui->tablewidget->sethorizontalheaderlabels(header); // 设置水平头
ui->tablewidget->setrowcount(5); // 设置总行数
ui->tablewidget->setedittriggers(qabstractitemview::noedittriggers); // 设置表结构默认不可编辑
// 填充数据
qstringlist namelist;
namelist << "lyshark a" << "lyshark b" << "lyshark c";
qstringlist sexlist;
sexlist << "男" << "男" << "女";
qint32 agelist[3] = {22,23,43};
// 针对获取元素使用 namelist[x] 和使用 namelist.at(x)效果相同
for(int x=0;x< 3;x++)
{
int col =0;
// 添加姓名
ui->tablewidget->setitem(x,col++,new qtablewidgetitem(namelist[x]));
// 添加性别
ui->tablewidget->setitem(x,col++,new qtablewidgetitem(sexlist.at(x)));
// 添加年龄
ui->tablewidget->setitem(x,col++,new qtablewidgetitem( qstring::number(agelist[x]) ) );
}
}
// 当前选择单元格发生变化时触发响应事件,也就是将底部状态栏标签设置
// https://www.cnblogs.com/lyshark
void mainwindow::on_tablewidget_currentcellchanged(int currentrow, int currentcolumn, int previousrow, int previouscolumn)
{
q_unused(previousrow);
q_unused(previouscolumn);
// 显示行与列的变化数值
//std::cout << "currentrow = " << currentrow << " currentcolumn = " << currentcolumn << std::endl;
//std::cout << "pre row = " << previousrow << " pre column = " << previouscolumn << std::endl;
// 获取当前单元格的item
qtablewidgetitem *item = ui->tablewidget->item(currentrow,currentcolumn);
if(item == null)
return;
// 设置单元格坐标
labcellindex->settext(qstring::asprintf("当前坐标: %d 行 | %d 列",currentrow,currentcolumn));
}
mainwindow::~mainwindow()
{
delete ui;
}
运行代码效果如下: