Qt C++ QStatusbar 显示表示状态的图片

1、前言

在C++ Qt编程中默认主窗口MainWindow底下自带控件QStatusbar,很多情况下都使用其显示程序的连接状态或开关状态,因为时常需要将图片设置为圆形显示,所以这里记录一下常用的设置的代码,方便以后复制粘贴。

2、封装设置状态的函数

(1)使用遮罩将图片设置成圆形

cpp 复制代码
QPixmap Utils::createCircularPixmap(const QPixmap &src, int diameter)
{
    // 创建一个圆形的 QBitmap
    QBitmap mask(diameter, diameter);
    mask.fill(Qt::color0);

    QPainter painter(&mask);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(Qt::color1);
    painter.drawEllipse(0, 0, diameter, diameter);
    painter.end();

    // 创建一个新的 QPixmap
    QPixmap circularPixmap(diameter, diameter);
    circularPixmap.fill(Qt::transparent);

    painter.begin(&circularPixmap);
    painter.setRenderHint(QPainter::Antialiasing);
    QPainterPath pathTemp;
    pathTemp.addEllipse(0, 0, diameter, diameter);
    painter.setClipPath(pathTemp);
    painter.drawPixmap(0, 0, diameter, diameter, src);
    painter.end();

    // 应用圆形遮罩
    circularPixmap.setMask(mask);

    return circularPixmap;
}

(2)调整大小并显示在QStatusbar中

cpp 复制代码
void Utils::statusbarSetPixmap(QStatusBar *statusbar, QString pixPath)
{
    QLabel *lastLabel = statusbar->findChild<QLabel *>(statusbar->objectName()+"_pixLabel");
    if(lastLabel != nullptr){
        delete lastLabel;
    }

    int statusbarSize = 30;//状态栏的大小,圆的直径?
    QLabel *imageLabel = new QLabel(/*qobject_cast<QWidget*>(*/statusbar/*->parent())*/);
    imageLabel->setFixedSize(statusbarSize, statusbarSize);
    imageLabel->setObjectName(statusbar->objectName()+"_pixLabel");

    QPixmap pixmap(pixPath);
    QPixmap pixmap2 = pixmap.scaled(statusbarSize, statusbarSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    imageLabel->setPixmap(Utils::createCircularPixmap(pixmap2, statusbarSize));

    statusbar->addWidget(imageLabel);
}

3、调用

举例两张图片:

调用,这里以http服务器是否开启为例子:

cpp 复制代码
if(httpServerIsOpen){
    Utils::statusbarSetPixmap(ui->statusbar, httpTrueImg);//显示开启状态
}else{
    Utils::statusbarSetPixmap(ui->statusbar, httpFalseImg);//显示关闭状态
}

效果图:

相关推荐
guodingdingh41 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
同勉共进4 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋4 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code5 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
王维同学7 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源