Qt 样式表:设置特定的 QMenuBar::item 背景颜色
Qt stylesheet : set a specific QMenuBar::item background color
我有一个 QMenuBar
,例如有两个 QMenu
项。
例如,如何才能让 "Floors" 项变成蓝色?我知道如何为所有项目更改它:
QMenuBar::item {
background: ...;
}
但我找不到为特定项目着色的方法。我尝试在 Qmenu
上使用 setProperty
,我尝试使用 setPalette
,...我发现没有任何效果。有没有办法在 C++ 代码中设置特定的 QMenuBar::item
属性?
终于找到东西了
创建自己的对象,例如WidgetMenuBar
,继承自QMenuBar
。
添加 属性 以标识应使用不同颜色的项目:
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);
重新实现您的小部件的 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函数的实现方法
我有一个 QMenuBar
,例如有两个 QMenu
项。
例如,如何才能让 "Floors" 项变成蓝色?我知道如何为所有项目更改它:
QMenuBar::item {
background: ...;
}
但我找不到为特定项目着色的方法。我尝试在 Qmenu
上使用 setProperty
,我尝试使用 setPalette
,...我发现没有任何效果。有没有办法在 C++ 代码中设置特定的 QMenuBar::item
属性?
终于找到东西了
创建自己的对象,例如
WidgetMenuBar
,继承自QMenuBar
。添加 属性 以标识应使用不同颜色的项目:
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);
重新实现您的小部件的
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函数的实现方法