You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QMainWindow的statusBar前添加永久显示的图标?

QMainWindow状态栏左侧永久显示图标的实现方案

方案一:给状态栏布局插入部件(简单直接)

QMainWindow的状态栏虽然官方不建议直接修改布局,但实际可以通过获取其内部布局来插入固定部件:

  • 创建一个QLabel用于承载图标,设置好适配状态栏的图标尺寸
  • 获取状态栏的布局,将QLabel插入到布局的最靠前位置
  • 无论状态栏是否显示临时消息,图标都会固定在左侧

PyQt5示例代码

from PyQt5.QtWidgets import QMainWindow, QLabel, QStatusBar, QApplication
from PyQt5.QtGui import QIcon

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setup_status_icon()

    def setup_status_icon(self):
        # 创建带图标的标签,替换为你的实际图标路径
        icon_label = QLabel()
        icon_label.setPixmap(QIcon("your_icon.png").pixmap(16, 16))
        
        status_bar = self.statusBar()
        # 将图标插入到状态栏布局的最左侧
        status_bar.layout().insertWidget(0, icon_label)
        
        # 测试临时消息,图标不会被覆盖
        status_bar.showMessage("这是一条临时提示", 2000)

if __name__ == "__main__":
    app = QApplication([])
    win = MainWindow()
    win.show()
    app.exec_()

C++示例代码

#include <QMainWindow>
#include <QLabel>
#include <QStatusBar>
#include <QIcon>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        setupStatusIcon();
    }

private:
    void setupStatusIcon()
    {
        QLabel* iconLabel = new QLabel(this);
        // 替换为你的实际图标路径
        iconLabel->setPixmap(QIcon("your_icon.png").pixmap(16, 16));
        
        QStatusBar* statusBar = this->statusBar();
        // 将图标插入到状态栏布局的最左侧
        statusBar->layout()->insertWidget(0, iconLabel);
        
        // 测试临时消息
        statusBar->showMessage("这是一条临时提示", 2000);
    }
};

方案二:重写状态栏paintEvent绘制图标

如果不想额外添加部件,可以直接在状态栏上绘制图标:

  • 自定义一个继承自QStatusBar的类,重写paintEvent方法
  • 先调用父类的paintEvent保证状态栏原有内容正常显示
  • 在状态栏左侧指定位置绘制图标

PyQt5示例代码

from PyQt5.QtWidgets import QMainWindow, QStatusBar, QApplication
from PyQt5.QtGui import QIcon, QPainter
from PyQt5.QtCore import Qt

class CustomStatusBar(QStatusBar):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 初始化图标,替换为你的实际图标路径
        self.status_icon = QIcon("your_icon.png")

    def paintEvent(self, event):
        # 先绘制状态栏原有内容
        super().paintEvent(event)
        
        # 绘制图标,调整位置适配状态栏
        painter = QPainter(self)
        pixmap = self.status_icon.pixmap(16, 16)
        x_pos = 5  # 左侧间距
        y_pos = (self.height() - pixmap.height()) // 2  # 垂直居中
        painter.drawPixmap(x_pos, y_pos, pixmap)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 设置自定义状态栏
        self.setStatusBar(CustomStatusBar(self))
        self.statusBar().showMessage("测试临时提示", 2000)

if __name__ == "__main__":
    app = QApplication([])
    win = MainWindow()
    win.show()
    app.exec_()

C++示例代码

#include <QMainWindow>
#include <QStatusBar>
#include <QPainter>
#include <QIcon>

class CustomStatusBar : public QStatusBar
{
    Q_OBJECT
public:
    CustomStatusBar(QWidget *parent = nullptr) : QStatusBar(parent)
    {
        statusIcon = QIcon("your_icon.png");
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        // 先绘制状态栏原有内容
        QStatusBar::paintEvent(event);
        
        QPainter painter(this);
        QPixmap pixmap = statusIcon.pixmap(16, 16);
        int x = 5;  // 左侧间距
        int y = (this->height() - pixmap.height()) / 2;  // 垂直居中
        painter.drawPixmap(x, y, pixmap);
    }

private:
    QIcon statusIcon;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        setStatusBar(new CustomStatusBar(this));
        statusBar()->showMessage("测试临时提示", 2000);
    }
};

注意事项

  • 别混淆addWidget()和addPermanentWidget():前者添加的部件会被临时消息覆盖,后者固定在状态栏右侧,都不符合左侧永久显示的需求。
  • 图标尺寸、左侧间距可以根据自己的UI风格调整。

内容的提问来源于stack exchange,提问作者Poison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:20:39