从QMenu中移除图标空间

10
我正在开发一款 Qt 应用程序(使用 C++ 编写)。在没有应用任何样式的情况下,我的菜单看起来像这样: enter image description here 我希望它看起来像这样: enter image description here 我该如何实现这个效果?可以使用 qss 或编程方式来完成。
我已经尝试过以下代码但没有成功:
    menu->addAction(tr("Add"), this, SLOT(CreateNewWaypoint()))->setIconVisibleInMenu(false);

需要Qt4.8和Qt5的答案才能获得完整的奖励!


看起来相关:https://dev59.com/u0XRa4cB1Zd3GeqPsYW4 - Azeem
设置自己的 stylesheet 以适用于 QMenu:https://stackoverflow.com/questions/31399610/qmenu-how-to-customize-the-menu-items-of-qmenu - Azeem
谢谢,两者都涉及到这个主题,没错。我的主要问题是如何使用样式表来处理菜单的各个部分。我找不到一个全面的列表来解决这个问题。 - JoergEwald
你正在使用 Qt4 还是 Qt5? - eyllanesc
Qt5。我在犹豫是否应该在问题中删除对Qt4.8的引用,但由于我不是作者,所以我不确定这样做是否正确... - mimo
显示剩余2条评论
3个回答

7

解决问题的一种方法是使用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);

6

您可以通过调整样式表来影响菜单的外观。使用您的示例代码,您可以执行以下操作:

menu.setStyleSheet("QMenu::item {"
                   "padding: 2px 5px 2px 2px;"
                   "}"
                   "QMenu::item:selected {"
                   "background-color: rgb(0, 85, 127);"
                   "color: rgb(255, 255, 255);"
                   "}");

注意padding属性,它设置菜单项矩形的偏移量。

0

我想要在 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接