0

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

在此处输入图像描述

例如,我怎样才能只使“地板”项目为蓝色?我知道如何为所有项目更改它:

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

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

4

1 回答 1

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);
        }
    }
    

你可以在这里看到如何实现paintEvent函数。

于 2017-01-22T13:36:06.800 回答