Qt 样式表:设置特定的 QMenuBar::item 背景颜色

Qt stylesheet : set a specific QMenuBar::item background color

我有一个 QMenuBar,例如有两个 QMenu 项。

例如,如何才能让 "Floors" 项变成蓝色?我知道如何为所有项目更改它:

QMenuBar::item {
     background: ...;
}

但我找不到为特定项目着色的方法。我尝试在 Qmenu 上使用 setProperty,我尝试使用 setPalette,...我发现没有任何效果。有没有办法在 C++ 代码中设置特定的 QMenuBar::item 属性?

终于找到东西了

  1. 创建自己的对象,例如WidgetMenuBar,继承自QMenuBar

  2. 添加 属性 以标识应使用不同颜色的项目:

    for (int i = 0; i < this->actions().size(); i++){
        actions().at(i)->setProperty("selection",false);
    }
    // Only the first item colored
    actions().at(0)->setProperty("selection",true);
    
  3. 重新实现您的小部件的 void paintEvent(QPaintEvent *e) 功能:

    void WidgetMenuBarMapEditor::paintEvent(QPaintEvent *e){
        QPainter p(this);
        QRegion emptyArea(rect());
    
        // Draw the items
        for (int i = 0; i < actions().size(); ++i) {
            QAction *action = actions().at(i);
            QRect adjustedActionRect = this->actionGeometry(action);
    
            // Fill by the magic color the selected item
            if (action->property("selection") == true)
                p.fillRect(adjustedActionRect, QColor(255,0,0));
    
            // Draw all the other stuff (text, special background..)
            if (adjustedActionRect.isEmpty() || !action->isVisible())
                continue;
            if(!e->rect().intersects(adjustedActionRect))
                continue;
            emptyArea -= adjustedActionRect;
            QStyleOptionMenuItem opt;
            initStyleOption(&opt, action);
            opt.rect = adjustedActionRect;
            style()->drawControl(QStyle::CE_MenuBarItem, &opt, &p, this);
        }
    }
    

大家可以看看herepaintEvent函数的实现方法