概述
在Qt中,可以使用样式表(StyleSheet)来自定义 QMenu
的外观,包括其子项(如菜单项QAction
)的颜色。但是,这通常可以设置 QMenu
的整体样式,而不能单独设置某个子项的颜色。不过,我们可以通过自定义的 QWidgetAction实现这一目标:
效果图
实现过程
- 创建一个继承自 QWidgetAction 的子类 ColorAction。
- 添加一个的 QWidget,在 QWidget 中添加一个 QLabel。
- 为这个 QLabel 设置样式表。
- 然后,将这个自定义的 QWidgetAction 添加到 QMenu 中。
关键代码
ColorAction 类
#pragma once#include <QWidgetAction>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QStyleOption>class ColorAction : public QWidgetAction
{Q_OBJECTpublic:ColorAction(const QString text, const int nMenuHeight, QObject *parent = nullptr);~ColorAction();private:QLabel *label;QWidget *widget;
};
#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 类
#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);}
}
源码下载
https://download.csdn.net/download/qiangzi4646/89754043