Таблица стилей Qt: установите определенный цвет фона QMenuBar::item

У меня есть QMenuBar, например, с двумя элементами QMenu.

введите здесь описание изображения

Как сделать, например, элемент "Этажи" только синим? Я знаю, как изменить его для ВСЕХ элементов с помощью:

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

Но я не могу найти способ покрасить конкретный предмет. Я пытался использовать setProperty на Qmenu, я пробовал с setPalette... Ничего не работает. Есть ли способ установить конкретное свойство QMenuBar::item в коде C++?


person Nat    schedule 22.01.2017    source источник


Ответы (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 функция.

person Nat    schedule 22.01.2017