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

相关推荐
ZH_qaq11 分钟前
【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
c++·算法
9ilk19 分钟前
【与C++的邂逅】--- C++的IO流
开发语言·c++
是小满满满满吗20 分钟前
C++中的继承
开发语言·c++·python
程序猿练习生20 分钟前
C++速通LeetCode简单第16题-买卖股票的最佳时机
开发语言·c++·leetcode
只对您心动31 分钟前
【QT】实现TCP服务器,客户端之间的通信
linux·服务器·c语言·开发语言·c++·qt·tcp/ip
MaTF_1 小时前
《Effective C++》第三版——让自己习惯C++
开发语言·c++
Antonio9151 小时前
【高级数据结构】树状数组
数据结构·c++·算法
Austim小白2 小时前
QT消息对话框学习
qt·学习
羊十一2 小时前
C++(C++的文件I/O)
开发语言·c++·cocoa
Am心若依旧4092 小时前
[C++进阶[六]]list的相关接口模拟实现
开发语言·数据结构·c++·算法·list