概述
在Qt中,可以使用样式表(StyleSheet)来自定义 QMenu
的外观,包括其子项(如菜单项QAction
)的颜色。但是,这通常可以设置 QMenu
的整体样式,而不能单独设置某个子项的颜色。不过,我们可以通过自定义的 QWidgetAction实现这一目标:
效果图
实现过程
- 创建一个继承自 QWidgetAction 的子类 ColorAction。
- 添加一个的 QWidget,在 QWidget 中添加一个 QLabel。
- 为这个 QLabel 设置样式表。
- 然后,将这个自定义的 QWidgetAction 添加到 QMenu 中。
关键代码
ColorAction 类
cpp
#pragma once
#include <QWidgetAction>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QStyleOption>
class ColorAction : public QWidgetAction
{
Q_OBJECT
public:
ColorAction(const QString text, const int nMenuHeight, QObject *parent = nullptr);
~ColorAction();
private:
QLabel *label;
QWidget *widget;
};
cpp
#include "ColorAction.h"
ColorAction::ColorAction(const QString text, const int nMenuHeight, QObject *parent /*= nullptr*/) : QWidgetAction(parent)
{
// 创建一个QWidget作为容器,并设置布局
widget = new QWidget();
QVBoxLayout *layout = new QVBoxLayout(widget);
layout->setContentsMargins(0, 0, 0, 0);
// 创建QLabel并设置文字颜色
label = new QLabel(text, widget);
label->setFixedHeight(nMenuHeight);
label->setFont(QFont(QString::fromLocal8Bit("微软雅黑"), 10.5));
label->setStyleSheet("QLabel{ padding-left:16px; color: #ff5050;background-color: rgb(255, 255, 255);} QLabel:hover{ background-color: #e9f2ff;}");
layout->addWidget(label);
setDefaultWidget(widget);
}
ColorAction::~ColorAction()
{
}
使用 QMenu 类
cpp
#include "QMenuColorDemo.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMouseEvent>
class QPoint;
QMenuColorDemo::QMenuColorDemo(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setFixedSize(310,200);
_menu = new QMenu;
_menu->setFixedWidth(115);
_menu->setFont(QFont(QString::fromLocal8Bit("微软雅黑"), 10.5));
int nMenuHeight = 30;
_menu->setStyleSheet(QString::fromLocal8Bit("QMenu{\
background:white;\
border:1px solid lightgray;\
padding-top:10px;\
padding-bottom:10px;\
}\
QMenu::item{\
padding:0px 20px;\
height:%1px;\
}\
QMenu::item:selected:enabled{\
background:#e9f2ff;\
color:black;\
}\
QMenu::item:selected:!enabled{\
background:transparent;\
}\
QMenu::separator{\
height:1px;\
background:#e4e4e4;\
margin:5px 0px 5px 0px;\
}").arg(nMenuHeight));
_viewAction = new QAction(QString::fromLocal8Bit("查看"), this);
_refreshAction = new QAction(QString::fromLocal8Bit("刷新"), this);
_delAction = new ColorAction(QString::fromLocal8Bit("删除"), nMenuHeight, this);
_menu->addAction(_viewAction);
_menu->addAction(_refreshAction);
_menu->addSeparator();
_menu->addAction(_delAction);
_btn = new QPushButton(QString::fromLocal8Bit("彩色菜单"));
connect(_btn,&QPushButton::clicked,this, [=](){
QPoint p = cursor().pos();
_menu->exec(p);
});
QHBoxLayout * hLayout = new QHBoxLayout;
hLayout->addWidget(_btn);
hLayout->addStretch();
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addItem(hLayout);
vLayout->addStretch();
this->setLayout(vLayout);
}
void QMenuColorDemo::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton )
{
QPoint p = cursor().pos();
_menu->exec(p);
}
}