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

时间:2017-01-22 12:27:37

标签: qt qmenubar

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

enter image description here

例如,我怎样才能将“Floors”项目设为蓝色?我知道如何更改所有项目:

QMenu

但是我找不到给特定项目上色的方法。我尝试在QMenuBar::item { background: ...; } 上使用setProperty,我尝试Qmenu,...我发现什么都没有用。有没有办法在C ++代码中设置特定的setPalette属性?

1 个答案:

答案 0 :(得分:1)

我终于找到了一些东西。

  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);
        }
    }
    
  4. 您可以看到here如何实现paintEvent函数。