Qt:QMenuBar同时显示图标和文字

原本是使用QToolBar实现需求,但QToolBar无法做到这样的效果:当鼠标放到某个item上点击弹出下拉菜单之后,移动到下一个item时,仍然自动弹出下拉菜单,也就是类似QMenuBar的菜单弹出效果。所以,我试图换到QMenuBar。

更换之后遇到一个问题,即:图标和文字无法共存。查阅Qt源码相关实现,问题出在 qtbase\src\plugins\styles\windowsvista\qwindowsvistastyle.cpp 的1164行(版本为Qt 6.3.0),内容如下:


            XPThemeData theme2(widget, painter,
                               QWindowsXPStylePrivate::MenuTheme,
                               MENU_BARITEM, stateId, option->rect);
            d->drawBackground(theme2);

            if (!pix.isNull())
                drawItemPixmap(painter, mbi->rect, alignment, pix);
            else
                drawItemText(painter, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled, mbi->text, textRole);

由此可见,图标存在时,就绘制了图标,否则绘制文字。图标和文字也就无法共存。

于是,想了几个解决方案:

  1. 重绘方式,重载paintEvent函数。但修改地方较多,比如需要重新计算各action的大小,因为之前的代码是设定了图标和文字不共存,所以QAction的大小计算在修改后肯定不同。另外就是实现重绘,显然由于QMenuBarPrivate的封装方式,这样也是较难。
  2. 修改qt源码。思路还是和上面类似,只不过直接修改源码,省去了考虑封装等问题。但考虑到qt升级频繁,自己修改代码是下策。
  3. 使用背景图+padding的方式。具体就是,将图标作为背景图放左边,文字加个padding,即可。发现这里也是这样的方式:How to display icon and text together in PYQT5 menubar   https://stackoverflow.com/questions/65707027/how-to-display-icon-and-text-together-in-pyqt5-menubar    。但是,这种方法对于动态生成的图标不行,而不巧的是,本人的代码中就是动态生成的图标。
  4. QWidgetAction。有个文章链接中提到这个,相信也可以。QMenu item text disappears when icon added https://stackoverflow.com/questions/18841141/qmenu-item-text-disappears-when-icon-added
  5. 还是改用QToolBar,相信改个菜单自动弹出,会比改这个绘制方便得多。

 

转载请注明来源,谢谢。

有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]


老刀的技术日志 » Qt:QMenuBar同时显示图标和文字

发表评论