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

相关推荐
weixin_3077791310 分钟前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse
秦少游在淮海1 小时前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用
AAA废品回收站陈师傅1 小时前
68常用控件_QGroupBox的使用
qt
const5441 小时前
cpp自学 day2(—>运算符)
开发语言·c++
明月醉窗台2 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
虾球xz2 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
沉到海底去吧Go2 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
CodeWithMe2 小时前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++
SuperCandyXu3 小时前
leetcode2368. 受限条件下可到达节点的数目-medium
数据结构·c++·算法·leetcode
愈努力俞幸运4 小时前
c++ 头文件
开发语言·c++