Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

概述

在Qt中,可以使用样式表(StyleSheet)来自定义 QMenu 的外观,包括其子项(如菜单项QAction)的颜色。但是,这通常可以设置 QMenu 的整体样式,而不能单独设置某个子项的颜色。不过,我们可以通过自定义的 QWidgetAction实现这一目标:

效果图

实现过程

  1. 创建一个继承自 QWidgetAction 的子类 ColorAction。
  2. 添加一个的 QWidget,在 QWidget 中添加一个 QLabel。
  3. 为这个 QLabel 设置样式表。
  4. 然后,将这个自定义的 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);
	}
}

源码下载

https://download.csdn.net/download/qiangzi4646/89754043

相关推荐
Maple_land1 小时前
C++初阶——string的模拟实现(上)
c++
今晚打老虎1 小时前
c++弹窗
开发语言·c++
虾球xz1 小时前
游戏引擎学习第240天:将渲染器移至第三层
c++·学习·游戏引擎
muzi_liii2 小时前
认识哈希以及哈希表的模拟实现
c++·哈希算法
The Chosen One9852 小时前
C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象
开发语言·c++
zyx没烦恼2 小时前
线程池&&单例模式
linux·开发语言·c++·单例模式
清醒的兰3 小时前
Qt 调试信息重定向到本地文件
开发语言·qt
小王努力学编程3 小时前
【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)
linux·服务器·网络·c++·网络协议·学习·http
AI+程序员在路上3 小时前
QT跨平台软件开发要点
开发语言·qt
是店小二呀4 小时前
【优选算法 | 滑动窗口】滑动窗口算法:高效处理子数组和子串问题
c++·算法