日志
QT菜单图标放大
2015-05-08 11:26
QT菜单图标放大 Qt菜单图标放大我主要是为了解决4k显示问题,界面的其他地方都可以根据设置固定大小来放大图标,唯独菜单不能也没有相关设置函数,在网上搜索了相关代码。在我这里依然没起到任何作用。最后只有选择最笨的但又最有用的方法:改写菜单里面每一项。 1. 以前向菜单里面加载项是直接加载QAction *要将这个改成QwidgetAction *; 2. QwidgetAction向这个里面设置默认Qwidget项,调用QwidgetAction类中的setDefaultWidget函数设置你要添加的Qwidget,我使用的Qwidget是Qpushbutton,应为这个有点击消息,以前和Qaction连接的消息可以用QpushButton连接了使用,对我来说方便。 3. 向Qwidgetacion中条件了Qpushbutton,在把QwidgetAcion添加到Qmenu中。 4. 显示出来的菜单你会发现和以前用Qaction添加的菜单不一样,原因就是现在添加的菜单里的每一项内容是居中显示的,为了解决这个问题我直接自绘了QpushButton. class CButtonAct : public QPushButton { Q_OBJECT public: CButtonAct(const QIcon & icon, const QString & text, int &nMaxWidth, QWidget * parent = 0); ~CButtonAct(); private: bool m_bEnter; QIcon m_Icon; QString m_strText; void enterEvent(QEvent *event); void leaveEvent(QEvent *event); void paintEvent(QPaintEvent *event); }; #include "ButtonAct.h" CButtonAct::CButtonAct(const QIcon &icon, const QString &text, int &nMaxWidth, QWidget *parent): QPushButton(icon,"", parent) { m_bEnter = false; m_Icon = icon; m_strText = text; QFont font(this->font()); QFontMetrics fm(font); int nWidth = fm.width(text)+25; if (nWidth > nMaxWidth) { nMaxWidth = nWidth; } setFixedHeight(26); } CButtonAct::~CButtonAct() { } void CButtonAct::enterEvent(QEvent *event) { QPushButton::enterEvent(event); m_bEnter = true; update(); } void CButtonAct::leaveEvent(QEvent *event) { QPushButton::leaveEvent(event); m_bEnter = false; update(); } void CButtonAct::paintEvent(QPaintEvent *e) { if (text() != "") { m_strText = text(); } QPainter painter(this); if (m_bEnter) { painter.drawPixmap(QRect(0,0,width(),height()), QPixmap(":/res/Button/ScheduleTask_weekly_hover.png")); } painter.drawPixmap(QRect(2,5,16,16), m_Icon.pixmap(16,16)); painter.drawText(20, 6, width(), height(), Qt::AlignLeft, m_strText); } 5. 现在已经比较好了,设置每一个按钮的宽度(setFixedHeight(int))就可以正常显示了,如果是做产品;你会发现还有一个小问题就是:选中菜单的时候由于你设置菜单项里面按钮固定宽度不一样导致选中不是整行选中(导致这个的原因是由于菜单里面每一项是以最长的那一项作为Qmenu的宽度)。 解决这个的办法就是: 在向每一个QwidgetAction中设置默认QputtonPush的时候算出内容最长的那一项,然后设置所有QpushButton的固定宽度为最长那项的宽度就好。 QFont font(this->font()); QFontMetrics fm(font); int nWidth = fm.width(text); 上面代码就是获取按钮上文本宽度的。 欢迎登录www.disktool.com观看效果 |