【Qt】qss 设置通过 addAction 添加的 QToolButton的图标

在这里插入图片描述

文章目录

      • 1. 使用 QSS 和状态
      • 示例代码
      • 2. 使用 QSS 动态更改图标
      • QSS 示例
      • 总结

在 Qt 中,QSS 不能直接用于为 QAction 设置图标,因为 QSS 主要用于样式和外观的设置,而不是用于数据(如图标)的设置。

不过,你可以通过一些间接的方法来实现类似的效果,例如使用 QToolButtonicon 属性来根据状态或其他条件更改图标。以下是一些方法来实现这种灵活性:

1. 使用 QSS 和状态

虽然不能直接通过 QSS 设置 QAction 的图标,但你可以利用 QToolButton 的状态来改变其图标。你可以在 QSS 中定义不同状态下的样式,并在代码中根据需要更改图标。

示例代码

#include <QApplication>
#include <QToolButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QFile>
#include <QTextStream>
#include <QIcon>

void loadStyleSheet(const QString &fileName) {
    QFile file(fileName);
    if (file.open(QFile::ReadOnly)) {
        QTextStream stream(&file);
        QString styleSheet = stream.readAll();
        qApp->setStyleSheet(styleSheet);
    }
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 加载 QSS 文件
    loadStyleSheet("styles.qss");

    QWidget window;
    QVBoxLayout layout(&window);

    QToolButton *toolButton = new QToolButton();
    toolButton->setText("Click me!");  // 可以设置文本
    toolButton->setIconSize(QSize(32, 32));  // 设置图标大小

    // 创建 QAction
    QAction *action = new QAction("Action", toolButton);
    toolButton->addAction(action);
    
    // 设置 QToolButton 的默认动作
    toolButton->setDefaultAction(action);

    layout.addWidget(toolButton);
    window.setLayout(&layout);
    window.resize(300, 200);
    window.show();

    // 动态更改图标
    toolButton->setIcon(QIcon(":/images/icon.png"));  // 设置默认图标

    // 例如,当按钮被点击时,改变图标
    QObject::connect(toolButton, &QToolButton::clicked, [toolButton]() {
        static bool toggle = false;
        toggle = !toggle;
        toolButton->setIcon(QIcon(toggle ? ":/images/icon2.png" : ":/images/icon.png"));
    });

    return app.exec();
}

2. 使用 QSS 动态更改图标

如果你希望通过 QSS 来灵活地更改图标,你可以在代码中根据条件动态设置图标,然后通过 QSS 来调整其他样式。

QSS 示例

/* styles.qss */
QToolButton {
    background-color: lightgray;
    border: none;  /* 去掉边框 */
}

QToolButton:hover {
    background-color: darkgray;
}

QToolButton:pressed {
    background-color: gray;
}

/* 这里没有办法直接设置图标 */

总结

  • QSS 不能直接设置 QAction 的图标
  • 你可以通过 QToolButton 的状态和代码逻辑来动态更改图标。
  • 使用 setIcon() 方法在代码中设置图标。

如果你需要通过某种方式来实现更复杂的图标替换,可能需要考虑其他设计模式,例如使用模型-视图架构来管理图标和状态。

上一篇:【golang】解析 JSON到指定结构体


下一篇:【读书笔记·VLSI电路设计方法解密】问题27:什么是可制造性设计