[toc]

问题描述

右键托盘弹出菜单,这个菜单是是通过 QMenu 实现的,通过添加 QAction 实现了几个子项。后续 UI 优化,提出需要修改 Icon的大小,设置 Icon 的大小为 24*24,遂进行了一番尝试,因影响颇多,暂且记录于此。

关于我这个右键托盘弹出选项框的肯定有别的方案,但是第一时间是想找一种比较简单的方案去实现,因此一直在搜索如何设置Icon大小的问题,目前看到的解决方案有以下几种:

  1. 通过设置 Style 实现
  2. 通过 QWidgetAction 实现
  3. 新建一个 Widget,实现 QMenu 的效果

1 通过设置 Style,修改icon size

  1. 新建样式类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#pragma once

#include <QCommonStyle>
#include <QStyleOption>
// 自定义一个style类,通过setStyle设置给menu,以此设置iconsize
class QCustonIconStyle : public QCommonStyle
{
Q_OBJECT

public:
QCustonIconStyle(int size)
: QCommonStyle(), size_(size) {}

protected:
int QCustonIconStyle::pixelMetric(PixelMetric metric, const QStyleOption* option, const QWidget* widget) const override
{

if (metric == QStyle::PM_SmallIconSize) {
return size_;
}

#if 1
// 一下内容是我尝试修改UI的,改了size之后会导致icon移位,需要修改间距和边距
else if (metric == QStyle::PM_LayoutLeftMargin)
{
return 1;
}
else if (metric == QStyle::PM_MenuHMargin)
{
return 1;
}
else if (metric == QStyle::PM_LayoutHorizontalSpacing)
{
return 1;
}
#endif


return QCommonStyle::pixelMetric(metric, option, widget);

}

private:
int size_;
};
  1. 使用方法:
1
2
QCustonIconStyle* style = new QCustonIconStyle(20);
QMenu->setStyle(style);
  1. 遗留问题,使用该方法之后,QActionhorverd() 信号就不会触发了

    关于这个问题的解决方法也很简单,尝试了一天,最终选择继承重写 QProxyStyle 就能解决这个问题。

2 使用 QWidgetAction

1
2
3
4
action_ = new QPushButton(menu);
QWidgetAction* action = new QWidgetAction(this);
action->setDefaultWidget(action_ );
menu->addAction(action);

3 新建界面