例如,我有QMenuBar
两个QMenu
项目。
例如,我怎样才能只使“地板”项目为蓝色?我知道如何为所有项目更改它:
QMenuBar::item {
background: ...;
}
但我找不到为特定项目着色的方法。我尝试使用setProperty
on Qmenu
,尝试使用setPalette
,... 我发现没有任何效果。QMenuBar::item
有没有办法在 C++ 代码中设置特定属性?
我终于找到了一些东西。
创建您自己的对象,例如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);
}
}
你可以在这里看到如何实现paintEvent函数。