Qt5自定义状态栏QStatusBar外观(背景)和状态栏基本用法(显示普通消息、临时消息、永久消息)

2023-11-18

本文主要总结Qt状态栏QSatatuBar用法,通过继承状态栏,自定义状态栏背景图形,以及状态栏三种基本用法。

状态栏类QStatusBar主要有显示普通消息、显示定时消息、显示永久消息三种功能。三种都十分常用,下面先总结自定义状态栏外观用法和将状态栏三种用法进行详细讲解和代码编写。

一、自定义状态栏外观

1.1原理详解

状态栏类QStatusBar继承于QWidget,我们继承QStatusBar,然后在QStatusBar界面上不用布局添加相关控件,进行外观设置。

如下图所示,要实现这种四个角落有边角时,可以通过QPainter事件重绘,但是一种更简单方式是不用布局类,直接在QStatusBar界面里面的四个角落添加四个图片,就可以轻易实现这种效果。这种方式能够实现任意图形层叠设置。

 

1.2实现代码。分别添加一个类,继承QStatusBar,然后在qcustomsatusbar.h、qcustomsatusbar.cpp添加如下代码

qcustomsatusbar.h

#ifndef QCUSTOMSATUSBAR_H
#define QCUSTOMSATUSBAR_H

#include <QWidget>
#include <QStatusBar>
#include <QLabel>

class QCustomSatusBar : public QStatusBar
{
public:
    explicit QCustomSatusBar(QWidget *parent=nullptr);

    void initUI();

private:
    QSize size;
    QLabel *leftTopLbl;
    QLabel *leftBottomLbl;
    QLabel *rightTopLbl;
    QLabel *rightBottomLbl;

protected:
    void resizeEvent(QResizeEvent *event);    
};

#endif // QCUSTOMSATUSBAR_H

 

qcustomsatusbar.cpp

#include "qcustomsatusbar.h"

QCustomSatusBar::QCustomSatusBar(QWidget *parent):QStatusBar(parent)
{    
    initUI();
}

void QCustomSatusBar::initUI()
{
    this->resize(640,320);
    this->setSizeGripEnabled(false);    //屏蔽右下角有伸缩功能的小三角形

    size=QSize(20,20);

    //初始化
    leftTopLbl=new QLabel(this);
    leftBottomLbl=new QLabel(this);
    rightTopLbl=new QLabel(this);
    rightBottomLbl=new QLabel(this);

    leftTopLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/leftTop.png"));
    leftBottomLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/leftBottom.png"));
    rightTopLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/rightTop.png"));//QCustomSatusBar rightBottom  rightTop
    rightBottomLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/rightBottom.png"));

    leftTopLbl->setScaledContents(true);
    leftBottomLbl->setScaledContents(true);
    rightTopLbl->setScaledContents(true);
    rightBottomLbl->setScaledContents(true);

    leftTopLbl->show();
    leftBottomLbl->show();
    rightTopLbl->show();
    rightBottomLbl->show();
}

void QCustomSatusBar::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);

    //设置四个角落图标大小
    leftTopLbl->setFixedSize(size);
    leftBottomLbl->setFixedSize(size);
    rightTopLbl->setFixedSize(size);
    rightBottomLbl->setFixedSize(size);

    //设置四个图标位置,随着窗口尺寸变化而变化
    leftTopLbl->setGeometry(0,0,leftTopLbl->width(),leftTopLbl->height());
    leftBottomLbl->setGeometry(0,height()-leftBottomLbl->height(),leftBottomLbl->width(),leftBottomLbl->height());
    rightTopLbl->setGeometry(width()-rightTopLbl->width(),0,rightTopLbl->width(),rightTopLbl->height());
    rightBottomLbl->setGeometry(width()-rightBottomLbl->width(),height()-rightBottomLbl->height(),rightBottomLbl->width(),rightBottomLbl->height());

}

1.3调用方法

在任意一个初始化界面构造函数中,添加如下代码

#include <QVBoxLayout>
#include <QLabel>

#include "qcustomsatusbar.h"


void Widget::setupUI()
{
    //初始化,调用自定义状态栏
    customSatusBar=new QCustomSatusBar();
    customSatusBar->setFixedHeight(100);
    customSatusBar->setObjectName("QCustomSatusBar");
    customSatusBar->setStyleSheet("#QCustomSatusBar{background-color:rgba(123,41,36,0.5);}");

    QVBoxLayout *vlayout=new QVBoxLayout;
    vlayout->setMargin(0);
    vlayout->setSpacing(0);
    vlayout->addStretch();
    vlayout->addWidget(customSatusBar);
    this->setLayout(vlayout);
}

1.4总结

之后可以将该类当成QStatusBar一样调用就行,这个类跟状态栏QStatusBar的主要区别在于背景形状不一样,其它都一样设置和调用。

 

二、状态栏QStatusBar显示普通消息

2.1原理讲解

状态栏类QStatusBar显示普通消息时,主要用如下函数。

void QStatusBar::addWidget(QWidget *widget, int stretch = 0);

用该函数可以添加QWidget控件和各种继承QWidget的子类。显示时,添加的控件QWidget固定左对齐,好像不能调整,博主调整过,但是没有效果。

2.2示例代码用法如下,在按钮槽函数添加如下代码

void Widget::on_pushButton_clicked()
{
    //状态栏显示一般信息,只能显示在最左边
    QLabel *showNormalInfo=new QLabel("显示一般信息",customSatusBar);
    showNormalInfo->setFixedSize(150,50);
    showNormalInfo->setFrameShape(QFrame::WinPanel);    //设置标签状态
    showNormalInfo->setFrameShadow(QFrame::Sunken);     //设置阴影
    showNormalInfo->setGeometry(100,0,100,200);

    customSatusBar->addWidget(showNormalInfo);
    showNormalInfo->show();
}

三、状态栏QStatusBar显示临时消息

3.1原理讲解

显示临时消息主要用到函数

void QStatusBar::showMessage(const QString &text, int timeout = 0);

该函数直接添加一个字符串,显示在整个状态栏里面,并且覆盖所有普通显示的QWidget控件,消息出现在状态栏最顶层界面。同样的,该消息在状态栏显示时,也是固定左对齐,好像不能调整。该函数第二个参数是定时时间,单位为毫秒,也就是设置为1000,则停留一秒钟,然后切换到普通显示界面。

3.2效果图如下所示

 

3.3调用代码如下

void Widget::on_pushButton_2_clicked()
{
    //显示暂时信息,只能显示在最左边
    customSatusBar->showMessage("显示临时信息",3000); //默认显示在左边
}

四、状态栏QStatusBar显示永久消息

4.1原理讲解

状态栏显示永久消息时,一般用于显示固定的内容,比如公司信息(logo、链接地址)、产品版本说明等。永久消息在状态栏的显示默认是右对齐,核心函数只有一个。并且永久消息不会被临时消息覆盖,一直显示状态栏在最顶层。

void QStatusBar::addPermanentWidget(QWidget *widget, int stretch = 0);

4.2调用方式如下

void Widget::on_pushButton_3_clicked()
{
    //显示永久信息,只能显示在最右边
    QLabel *permanentInfo=new QLabel(customSatusBar);
    permanentInfo->setFrameStyle(QFrame::Box|QFrame::Sunken);   //设置框架风格:盒子和阴影
    permanentInfo->setText(QString("<a href=\"http://easyforensics.com\">永久信息:易取证</a>"));
    permanentInfo->setOpenExternalLinks(true);
    permanentInfo->setFixedHeight(30);
    customSatusBar->addPermanentWidget(permanentInfo);
}

4.3效果图如下

 

五、完整工程实例代码

5.1新建一个Widget工程,勾选UI,然后添加一个继承QStatusBar的类QCustomSatusBar,在UI界面拖入三个按钮,分别命名如下图所示:

 

5.2分别在qcustomsatusbar.h、qcustomsatusbar.cpp、widget.h、widget.cpp、main.cpp中,添加如下代码

qcustomsatusbar.h

#ifndef QCUSTOMSATUSBAR_H
#define QCUSTOMSATUSBAR_H

#include <QWidget>
#include <QStatusBar>
#include <QLabel>

class QCustomSatusBar : public QStatusBar
{
public:
    explicit QCustomSatusBar(QWidget *parent=nullptr);

    void initUI();

private:
    QSize size;
    QLabel *leftTopLbl;
    QLabel *leftBottomLbl;
    QLabel *rightTopLbl;
    QLabel *rightBottomLbl;

protected:
    void resizeEvent(QResizeEvent *event);    
};

#endif // QCUSTOMSATUSBAR_H

 

qcustomsatusbar.cpp

#include "qcustomsatusbar.h"

QCustomSatusBar::QCustomSatusBar(QWidget *parent):QStatusBar(parent)
{    
    initUI();
}

void QCustomSatusBar::initUI()
{
    this->resize(640,320);
    this->setSizeGripEnabled(false);    //屏蔽右下角有伸缩功能的小三角形

    size=QSize(20,20);

    //初始化
    leftTopLbl=new QLabel(this);
    leftBottomLbl=new QLabel(this);
    rightTopLbl=new QLabel(this);
    rightBottomLbl=new QLabel(this);

    leftTopLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/leftTop.png"));
    leftBottomLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/leftBottom.png"));
    rightTopLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/rightTop.png"));//QCustomSatusBar rightBottom  rightTop
    rightBottomLbl->setPixmap(QPixmap(":/new/prefix1/resource/image/rightBottom.png"));

    leftTopLbl->setScaledContents(true);
    leftBottomLbl->setScaledContents(true);
    rightTopLbl->setScaledContents(true);
    rightBottomLbl->setScaledContents(true);

    leftTopLbl->show();
    leftBottomLbl->show();
    rightTopLbl->show();
    rightBottomLbl->show();
}

void QCustomSatusBar::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);

    //设置四个角落图标大小
    leftTopLbl->setFixedSize(size);
    leftBottomLbl->setFixedSize(size);
    rightTopLbl->setFixedSize(size);
    rightBottomLbl->setFixedSize(size);

    //设置四个图标位置,随着窗口尺寸变化而变化
    leftTopLbl->setGeometry(0,0,leftTopLbl->width(),leftTopLbl->height());
    leftBottomLbl->setGeometry(0,height()-leftBottomLbl->height(),leftBottomLbl->width(),leftBottomLbl->height());
    rightTopLbl->setGeometry(width()-rightTopLbl->width(),0,rightTopLbl->width(),rightTopLbl->height());
    rightBottomLbl->setGeometry(width()-rightBottomLbl->width(),height()-rightBottomLbl->height(),rightBottomLbl->width(),rightBottomLbl->height());

}

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include "qcustomsatusbar.h"

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void setupUI();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;

    QCustomSatusBar *customSatusBar;
};

#endif // WIDGET_H

 

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QVBoxLayout>
#include <QLabel>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setupUI();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setupUI()
{
    //初始化,调用自定义状态栏
    customSatusBar=new QCustomSatusBar();
    customSatusBar->setFixedHeight(100);
    customSatusBar->setObjectName("QCustomSatusBar");
    customSatusBar->setStyleSheet("#QCustomSatusBar{background-color:rgba(123,41,36,0.5);}");

    QVBoxLayout *vlayout=new QVBoxLayout;
    vlayout->setMargin(0);
    vlayout->setSpacing(0);
    vlayout->addStretch();
    vlayout->addWidget(customSatusBar);
    this->setLayout(vlayout);
}

void Widget::on_pushButton_clicked()
{
    //状态栏显示一般信息,只能显示在最左边
    QLabel *showNormalInfo=new QLabel("显示一般信息",customSatusBar);
    showNormalInfo->setFixedSize(150,50);
    showNormalInfo->setFrameShape(QFrame::WinPanel);    //设置标签状态
    showNormalInfo->setFrameShadow(QFrame::Sunken);     //设置阴影
    showNormalInfo->setGeometry(100,0,100,200);

    customSatusBar->addWidget(showNormalInfo);
    showNormalInfo->show();
}

void Widget::on_pushButton_2_clicked()
{
    //显示暂时信息,只能显示在最左边
    customSatusBar->showMessage("显示临时信息",3000); //默认显示在左边
}

void Widget::on_pushButton_3_clicked()
{
    //显示永久信息,只能显示在最右边
    QLabel *permanentInfo=new QLabel(customSatusBar);
    permanentInfo->setFrameStyle(QFrame::Box|QFrame::Sunken);   //设置框架风格:盒子和阴影
    permanentInfo->setText(QString("<a href=\"http://easyforensics.com\">永久信息:易取证</a>"));
    permanentInfo->setOpenExternalLinks(true);
    permanentInfo->setFixedHeight(30);
    customSatusBar->addPermanentWidget(permanentInfo);
}

 

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

5.2程序运行结果如下所示

 

 

 

参考内容:

https://blog.csdn.net/oShouQianShou/article/details/68924825(参考:状态栏QSatusBar三种状态代码)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5自定义状态栏QStatusBar外观(背景)和状态栏基本用法(显示普通消息、临时消息、永久消息) 的相关文章

随机推荐

  • 30屏幕参数_荣耀30三大重要参数曝光:男女生都喜欢

    去年上半年 荣耀发布了年度旗舰手机荣耀20系列 作为荣耀的旗舰系列手机 每一代产品都是备受关注的 也是销量较为乐观的一个旗舰系列 每一代都有代言人 也体现了品牌方对于这个系列产品的自信 这一次的代言人是去年大火 并代言过荣耀多款产品的李现
  • 程序员的思维方式

    读书不觉已春深 一寸光阴一寸金 不觉间实习已近四周 我想起这首诗 并非标榜自己学习 工作有多投入 而是感慨时间静悄悄得溜过 只有当你回首时 才能觉察到它的存在且已过去 程序员浏览博客是必不可少的 但想要获得更多的成长 写博客是一种很好的方式
  • 2021数学建模竞赛国赛ABCD题目分析以及代码实现

    2021 年高教社杯全国大学生数学建模竞赛题目 请先阅读 全国大学生数学建模竞赛论文格式规范 C 题 生产企业原材料的订购与运输 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料 总体可分为 A B C 三种类型 该企
  • Docker安装Elasticsearch

    Elasticsearch安装 ElasticSearch安装就相当于安装MySQL数据库 下载对应的镜像文件 docker pull elasticsearch 7 4 2 创建需要挂载的目录 mkdir p mydata elastic
  • ubuntu ARM下OpenCV的交叉编译

    OpenCV3 4 3编译安装 需求 环境及工具 利用cmake gui进行相关配置 1 cmake gui界面配置opencv 并生成Makefile 2 配置生成目标选项 3 配置编译器 4 指定编译内容 路径等配置 5 执行配置 生成
  • VS2015编译boost,并进行使用

    VS2015编译boost 并进行使用 1 到官网下载最新的boost www boost org 这里我下载的1 68版本 2 安装 解压后运行bootstrap bat文件 稍等一小会就OK 3 编译boost库 注意一定要使用VS20
  • 黑马jvm课程笔记d2

    目录 一 直接内存相关 1 1 定义 1 2 ByteBuffer 作用 1 3文件读写过程 1 3 直接内存溢出和释放 二 垃圾回收相关 2 1 判断是否可以回收 2 2 五种引用 编辑 2 2 1 软引用应用 2 2 2 弱引用应用 2
  • 【Linux-进程通信1】管道

    进程间通信介绍 进程间通信目的 在操作系统中 每个进程都是独立运行的 它们有自己的地址空间和资源 它们不能直接访问其他进程的资源 然而 在现代计算机系统中 很少有一个进程能够独立完成所有任务 因此需要不同的进程之间进行通信和协作 进程间通信
  • Linux中Ubuntu卡顿问题解决

    解决vmware虚拟机速度慢的3种方法 使用vmware虚拟操作系统的好处不用多说 但如果虚拟机运行速度十分缓慢 正常使用很卡的话是很痛苦的 本文介绍了3种提高虚拟机运行速度的方法 都是古意人实际操作过的方法 效果显著 推荐大家一试 1 给
  • 【复习】软考中级_软件设计师(2021)__上午

    前言 1 总想瞎bb点什么内容 2 自己复习的笔记 分享大家一起使用 3 可能有错误请指教 4 对于有些基础内容进行省略 5 适合等公交 摸鱼 无聊的时候观看 6 技术有限 哪里出错误了请指教 十分感谢 一 计算机组成与结构 数据的转换 1
  • 【C++ Primer 第五版】 目录-第Ⅰ部分

    序言和前言 第一章 开始 1 1 编解一个简单的C 程序 1 1 1 编译 运行程序 1 2 初识输入输出 1 3 注释简介 1 4 控制流 1 4 1 while 语句 1 4 2 for语句 1 4 3 读取数量不定的输入数据 1 4
  • 【Python】赋值、浅拷贝与深拷贝(附图解)

    Python 赋值 浅拷贝与深拷贝 附图解 Python的变量 可变对象与不可变对象 可变对象 不可变对象 赋值 浅拷贝与深拷贝的区别 可变对象的赋值 浅拷贝与深拷贝 赋值 浅拷贝 深拷贝 不可变对象的赋值 浅拷贝与深拷贝 结论 Pytho
  • xml文件修改后,git提交,变更列表中没有xml文件

    小编通过ctrl shift R找到需要修改的xml文件 修改后git提交 变更列表中没有 经过同事提醒 发现自己修改的是编译的xml文件 所以git提交 变更列表中没有xml文件 解决方法 找到Dao层下的xml文件进行修改 git提交变
  • matlab空间马尔可夫链式,基于MATLAB操作的马尔可夫链蒙特卡罗方法(MCMC)

    1 Sampling from Random Variables 4 1 1 Standard distributions 4 1 2 Sampling from non standard distributions 7 1 2 1 Inv
  • 边缘云与中心云_云与边缘的工业制造困境

    边缘云与中心云 Typically Deep Learning the subspecies of AI application that have gained the spotlight in the past few years th
  • *SVN从服务器新建本地库2021-10-18

    SVN从服务器新建本地库 1 如图打开版本库浏览器 2 在右侧空白处新建文件夹 3 选中文件夹右键检出 后续按照提示选择自己指定的本地文件夹位置即可 后面就可以跟服务器上传和下拉了
  • 20180726:Mac中文件.DS_store的隐藏与开启

    简介 DS store是存储文件夹属性的文件 1 开启 打开终端 键入命令 defaults write com apple finder AppleShowAllFiles YES defaults write com apple fin
  • ref 在 React 中的使用方法和说明

    react标签中ref的写法在 React 中 ref 属性用于引用组件中的某个元素或组件实例 以便在需要时对其进行操作 ref 属性的应用场景很多 比如直接访问 DOM 节点 管理 focus 状态 嵌套子组件等等 下面 我们来详细了解一
  • 递归求逆序

    Description 输入多行文字 输出其逆序 Input 多个文字 Output 其逆序 Sample Input 1 abcd wdwe Sample Output 1 ewdw dcba Hint int main recursiv
  • Qt5自定义状态栏QStatusBar外观(背景)和状态栏基本用法(显示普通消息、临时消息、永久消息)

    本文主要总结Qt状态栏QSatatuBar用法 通过继承状态栏 自定义状态栏背景图形 以及状态栏三种基本用法 状态栏类QStatusBar主要有显示普通消息 显示定时消息 显示永久消息三种功能 三种都十分常用 下面先总结自定义状态栏外观用法