今天做了一个需求,本来以为很简单,结果用了两三个小时才搞定,google和百度了好多答案都不实用,最后自己解决了,记录分享一下解决办法。
需求是这样的:一个菜单栏,插入的action是图片加文字,qt的action是支持这种格式的,问题是action的icon大小无法控制,网上找到的答案,都是只能改变icon的宽度,无法改变高度。
#include <QCommonStyle>
// 自定义一个style类,通过setStyle设置给menu,以此设置iconsize
class CustomIconStyle : public QCommonStyle
{
Q_OBJECT
public:
CustomIconStyle(int size)
: QCommonStyle(), size_(size) {}
protected:
int CustomIconStyle::pixelMetric(PixelMetric metric, const QStyleOption * option, const QWidget * widget) const override
{
if (metric == QStyle::PM_SmallIconSize) {
return size_;
}
return QCommonStyle::pixelMetric(metric, option, widget);
}
private:
int size_;
};
很疑惑 iconsize返回的是一个,按道理size是长和宽,写代码测试了一下,如果是在代码中增加icon,这个action的高度跟PM_SmallIconSize一致,如果是在样式表中添加icon,高度不会变化。
// style的使用方法举例,menu->setStyle(new CustomIconStyle(30)); (注意内存泄漏)
因为代码是用样式表来添加icon 的,所以继续查找解决办法。下面是最后用的解决办法
action_ = new QPushButton(menu);
QWidgetAction* action = new QWidgetAction(this);
action->setDefaultWidget(action_ );
menu->addAction(action);
用QWidgetAction来用当做菜单的小控件,它自带的setDefaultWidget函数可以方便的设置复杂的样式。