Qt中如何将QPixmap缩放至相同尺寸?点击图标后变大问题求助
Qt统一工具栏图标显示尺寸的解决方案
核心问题分析
你当前的代码手动将图标转成固定尺寸的QPixmap再构造QIcon,但这种方式会让QIcon仅包含单一尺寸的资源,当工具栏处理图标不同状态(如点击激活)时,Qt可能会拉伸该资源导致尺寸异常;同时单独处理每个图标的方式容易出现疏漏,导致显示不一致。
有效解决方法
1. 统一设置工具栏的图标尺寸(推荐)
直接给工具栏设置全局图标尺寸,所有添加到该工具栏的QAction图标都会自动按此尺寸显示,无需单独处理每个图标:
- 在工具栏初始化的代码(比如WToolbar的构造函数)中添加:
toolbar_->setIconSize(QSize(30, 30)); // 设定你需要的统一尺寸
- 修改两个图标初始化函数,去掉手动转QPixmap的步骤,直接用原图标文件构造QIcon:
void WToolbar::setCandlesColor() { QIcon icon("./src/icon/toolbar/chart-histogram-01.png"); SetColor = std::make_shared<QAction>(icon, QString("Button"), toolbar_.get()); SetColor->setToolTip("Green Bullish/ Red Bearish"); SetColor->setIconVisibleInMenu(true); toolbar_->addAction(SetColor.get()); connect(SetColor.get(), &QAction::triggered, plotter_.get(), &WPlotter::colorSwitch); connect(SetColor.get(), &QAction::triggered, this, &WToolbar::iconSwitch); } void WToolbar::setMA5() { QIcon icon("./src/icon/toolbar/chart-line-up-ma5.png"); PlotMA5 = std::make_shared<QAction>(icon, QString("Button"), toolbar_.get()); PlotMA5->setToolTip("show/hide MA5"); PlotMA5->setIconVisibleInMenu(true); toolbar_->addAction(PlotMA5.get()); connect(PlotMA5.get(), &QAction::triggered, plotter_.get(), &WPlotter::plotMA5); }
这种方式让Qt自动处理图标的缩放和状态适配,能保证所有图标在正常、点击、hover等状态下尺寸一致。
2. 确保切换图标时保持统一尺寸
如果你的iconSwitch函数中会切换SetColor的图标,要保证新图标也按统一尺寸处理:
void WToolbar::iconSwitch() { QIcon newIcon("./src/icon/toolbar/xxx.png"); // 或者用QPixmap缩放后构造图标,确保尺寸一致 QPixmap pixmap = newIcon.pixmap(QSize(30, 30)); SetColor->setIcon(QIcon(pixmap)); }
3. 给QIcon添加多尺寸资源(进阶)
如果需要适配不同DPI或场景,可以给QIcon添加多个尺寸的pixmap,让Qt自动选择合适的版本:
QIcon icon; icon.addPixmap(QPixmap("./src/icon/toolbar/chart-histogram-01.png").scaled(QSize(30,30)), QIcon::Normal, QIcon::On); icon.addPixmap(QPixmap("./src/icon/toolbar/chart-histogram-01.png").scaled(QSize(30,30)), QIcon::Normal, QIcon::Off); // 同样添加其他状态的pixmap
不过这种方式较繁琐,不如直接设置工具栏iconSize高效。
内容的提问来源于stack exchange,提问作者Weimin Chan
相关产品推荐
相关产品推荐

