解决问题的一种方法是使用QProxyStyle:
customstyle.h
#ifndef CUSTOMSTYLE_H
#define CUSTOMSTYLE_H
#include <QProxyStyle>
#include <QStyleOptionMenuItem>
class CustomStyle : public QProxyStyle{
public:
using QProxyStyle::QProxyStyle;
void drawControl(ControlElement element, const QStyleOption *opt, QPainter *p, const QWidget *w) const override
{
if(element == QStyle::CE_MenuItem){
QStyleOptionMenuItem myMenuOption;
const QStyleOptionMenuItem *menuOption =
qstyleoption_cast<const QStyleOptionMenuItem *>(opt);
if (menuOption) {
const int width = pixelMetric(PM_SmallIconSize)+6;
myMenuOption = *menuOption;
QRect r(myMenuOption.rect);
r.setLeft(-width);
myMenuOption.rect = r;
}
QProxyStyle::drawControl(element, &myMenuOption, p, w);
return;
}
QProxyStyle::drawControl(element, opt, p, w);
}
};
#endif // CUSTOMSTYLE_H
接下来,您需要将其安装在 QApplication
中:
QApplication a(argc, argv);
QApplication::setStyle(new CustomStyle);
您可以通过调整样式表来影响菜单的外观。使用您的示例代码,您可以执行以下操作:
menu.setStyleSheet("QMenu::item {"
"padding: 2px 5px 2px 2px;"
"}"
"QMenu::item:selected {"
"background-color: rgb(0, 85, 127);"
"color: rgb(255, 255, 255);"
"}");
我想要在 QPlainTextEdit 的标准上下文菜单中去掉图标。
只是对 QMenu 中的所有操作使用 setIconVisibleInMenu(false)
仍然会留下图标空间,如问题所示。
只有当我将菜单操作的图标设置为 null 图标时,才能摆脱图标空间。
完整示例:
void CustomPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
{
QMenu *menu = createStandardContextMenu();
foreach (QAction *action, menu->actions()) {
action->setIcon(QIcon());
}
menu->exec(event->globalPos());
delete menu;
}
stylesheet
以适用于QMenu
:https://stackoverflow.com/questions/31399610/qmenu-how-to-customize-the-menu-items-of-qmenu - Azeem