QT实战-qt各种菜单样式实现

news2024/12/26 20:40:33

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式,

先上图如下:

1.普通菜单样式

代码:

    m_pmenu = new QMenu(this);
    m_pmenu->setObjectName("quoteListMenu");

qss文件:

QMenu {
    background-color: #3b3c49;
    margin:0px;
    padding:0px;
}

QMenu::indicator {
    width: 31px;
    height:30px;
    background-color: #3b3c49;
    margin: 2px
}

QMenu::indicator:selected {
    background-color: #144675;
    margin: 2px
}

QMenu::indicator:disabled {
    background-color: #414141;
    margin: 2px
}

QMenu::item {
    color: #ffffff;
    height:24px;
    font:normal 14px;
    margin:0px;
    padding-left:12px;
    padding-right:41px;
}

QMenu::item:selected {
    color: #ffffff;
    background-color:#545563;
}

QMenu::item:disabled {
color: #707070;
background-color: #414141;
}

QMenu::indicator:checked {
    image:url(:/pic/tick.png);
}

/********/
QMenu#quoteListMenu
{
    background: #3b3c49;
    margin-top: 8px;
    margin-bottom: 8px;
    padding: 0px;
}

QMenu#quoteListMenu::item
{
    color: #ffffff;
    height: 24px;
    font-size: 14px;
    padding-left:12px;
    padding-right:50px;
    background-color: transparent;
}

QMenu#quoteListMenu::item:selected
{
    color: #ffffff;
    background-color: #545563;
}

QMenu#quoteListMenu::item:disabled {
    color: #707070;
    background-color:#414141;
}

QMenu#quoteListMenu::icon
{
    padding-left: 20px;
}


QMenu#quoteListMenu::indicator:selected
{
    background-color: #144675;
    margin: 2px;
}

2.带选中样式的菜单

代码:

    m_pmenu2 = new QMenu(this);
    m_pmenu2->setObjectName("quoteListMenu2");

qss文件:

QMenu {
    background-color: #3b3c49;
    margin:0px;
    padding:0px;
}

QMenu::indicator {
    width: 31px;
    height:30px;
    background-color: #3b3c49;
    margin: 2px
}

QMenu::indicator:selected {
    background-color: #144675;
    margin: 2px
}

QMenu::indicator:disabled {
    background-color: #414141;
    margin: 2px
}

QMenu::item {
    color: #ffffff;
    height:24px;
    font:normal 14px;
    margin:0px;
    padding-left:12px;
    padding-right:41px;
}

QMenu::item:selected {
    color: #ffffff;
    background-color:#545563;
}

QMenu::item:disabled {
color: #707070;
background-color: #414141;
}

QMenu::indicator:checked {
    image:url(:/pic/tick.png);
}

/*--------------------*/
QMenu#quoteListMenu2
{
    background: #3b3c49;
    margin-top: 8px;
    margin-bottom: 8px;
    padding: 0px;
}

QMenu#quoteListMenu2::item
{
    color: #ffffff;
    height: 24px;
    font-size: 14px;
    padding-left:30px;
    padding-right:50px;
    background-color: transparent;
}

QMenu#quoteListMenu2::item:selected
{
    color: #ffffff;
    background-color: #545563;
}

QMenu#quoteListMenu2::item:disabled {
    color: #707070;
    background-color:#414141;
}

QMenu#quoteListMenu2::icon
{
    padding-left: 10px;
}

QMenu#quoteListMenu2::indicator {
    width: 31px;
    height:30px;
    background-color: #3b3c49;
    margin: 2px
}

QMenu#quoteListMenu2::indicator:selected {
    background-color: #545563;
    margin: 2px
}

QMenu#quoteListMenu2::indicator:checked {
    image:url(:/pic/tick.png);
}

QMenu#quoteListMenu2::indicator:disabled {
    background-color: #414141;
    margin: 2px
}

3.带子菜单样式(可以调整下拉按钮到边框的距离)

代码:

    m_pmenu3 = new QMenu(this);
    m_pmenu3->setObjectName("myArrowGap");

qss文件:

QMenu {
    background-color: #3b3c49;
    margin:0px;
    padding:0px;
}

QMenu::indicator {
    width: 31px;
    height:30px;
    background-color: #3b3c49;
    margin: 2px
}

QMenu::indicator:selected {
    background-color: #144675;
    margin: 2px
}

QMenu::indicator:disabled {
    background-color: #414141;
    margin: 2px
}

QMenu::item {
    color: #ffffff;
    height:24px;
    font:normal 14px;
    margin:0px;
    padding-left:12px;
    padding-right:41px;
}

QMenu::item:selected {
    color: #ffffff;
    background-color:#545563;
}

QMenu::item:disabled {
color: #707070;
background-color: #414141;
}

QMenu::indicator:checked {
    image:url(:/pic/tick.png);
}

/****************/
QMenu#myArrowGap {
    background-color: #545563;
    border: 1px solid #000000;
    margin:0px;
    padding:0px;
}

QMenu#myArrowGap::item {
    color: #ffffff;
    font:normal 12px;
    margin-left:0px;
    margin-right:10px;
    margin-top: 0px;
    margin-bottom: 0px;
    padding-top:5;
    padding-bottom:5;
    padding-left:12px;
    padding-right:41px;
}

QMenu#myArrowGap::item:hover {
    color: #FFFFBB;
    background-color:#545563;
}

QMenu#myArrowGap::item:selected {
    color: #FFFFBB;
    background-color:#545563;
}

QMenu#myArrowGap::item:disabled {
color: #707070;
background-color: #414141;
}

说明:下拉按钮距离右边距离通过设置margin-right:10px;实现

4.超过一屏幕菜单样式

代码1:头文件添加

#include <QtWidgets>
#include <QStyle>

class UProxyStyle : public QProxyStyle
{
    Q_OBJECT
int styleHint(StyleHint h, const QStyleOption *op = Q_NULLPTR,
                    const QWidget *w = Q_NULLPTR, QStyleHintReturn *rd = Q_NULLPTR) const{
        printf("UMenu::styleHint  %d\n",h);
            switch(h){  
                case QStyle::SH_ScrollBar_LeftClickAbsolutePosition: return true;
                case QStyle::SH_ScrollBar_MiddleClickAbsolutePosition:return true;
                case QStyle::SH_ScrollBar_ScrollWhenPointerLeavesControl: return false;
                case QStyle::SH_Menu_Scrollable: return true;/*这一句是关键,返回true,表明支持*/ }
    return QProxyStyle::styleHint(h,op,w);	}
};

代码2:cpp中使用

    m_pmenu = new QMenu(this);
    //m_pmenu->setObjectName("myMenu");
    m_pmenu->setStyle(new UProxyStyle());
    connect(m_pmenu,&QMenu::triggered,this,&Dialog::slotTriggered);

说明:当超过屏幕时,会自动出现箭头

5.自定义带有滚动条的菜单样式(用QWidgetAction实现)

代码1:listwidgetaction.h文件

#ifndef LISTWIDGETACTION_H
#define LISTWIDGETACTION_H

#include <QWidgetAction>
#include <QListWidget>
#include <QObject>


class ListWidgetAction : public QWidgetAction
{
    Q_OBJECT

public:
    explicit ListWidgetAction(QWidget *parent);
    virtual ~ListWidgetAction();

    void AddString(QString strText, int id);
    void Clear();

    void SetRowHeight(int nHeight);
    void SetMaxHeight(int nMaxHeight);

signals:
    void sigClickItem(int id);

private slots:
    void slotListItemClicked(QListWidgetItem *item);

private:
    QListWidget* m_pListWidget;

    int m_nRowHeight = 20;
    int m_nMaxHeight = -1;


};

#endif // LISTWIDGETACTION_H

代码2:listwidgetaction.cpp文件

#include "listwidgetaction.h"
#include <QScrollBar>

ListWidgetAction::ListWidgetAction(QWidget *parent)
    :QWidgetAction(parent)
{
    m_pListWidget = new QListWidget(parent);
    m_pListWidget->setSpacing(0);
    m_pListWidget->setContentsMargins(0,0,0,0);
    m_pListWidget->setFocusPolicy(Qt::NoFocus);
    m_pListWidget->setVerticalScrollMode(QListWidget::ScrollPerPixel);//设置为像素滚动
    m_pListWidget->verticalScrollBar()->setEnabled(false);

    m_pListWidget->setObjectName("ListWidgetAction");
    m_pListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    m_pListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_pListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    connect(m_pListWidget, &QListWidget::itemClicked, this, &ListWidgetAction::slotListItemClicked);

    setDefaultWidget(m_pListWidget);
}

ListWidgetAction::~ListWidgetAction()
{

}

void ListWidgetAction::AddString(QString strText, int id)
{
    QListWidgetItem *item = new QListWidgetItem(strText);
    item->setData(Qt::UserRole, id);
    item->setSizeHint(QSize(-1, m_nRowHeight));
    item->setTextAlignment(Qt::AlignCenter);

    m_pListWidget->addItem(item);

    //
    int nCount = m_pListWidget->count();
    int nRowHeight = m_nRowHeight;
    int nTotalHeight = nCount * nRowHeight + 4;

    if(m_nMaxHeight != -1)
    {
        if(nTotalHeight > m_nMaxHeight)
        {
            nTotalHeight = m_nMaxHeight;
            m_pListWidget->verticalScrollBar()->setEnabled(true);
            m_pListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

        }
        else
        {
            m_pListWidget->verticalScrollBar()->setEnabled(false);
            m_pListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        }
    }

    m_pListWidget->setFixedHeight(nTotalHeight);

}

void ListWidgetAction::Clear()
{
    m_pListWidget->clear();

}

void ListWidgetAction::SetRowHeight(int nHeight)
{
    m_nRowHeight = nHeight;

}

void ListWidgetAction::SetMaxHeight(int nMaxHeight)
{
    m_nMaxHeight = nMaxHeight;

}

void ListWidgetAction::slotListItemClicked(QListWidgetItem *item)
{
    int id = item->data(Qt::UserRole).toInt();

    emit sigClickItem(id);

}

代码3:使用

 //菜单
 m_pmenu2 = new QMenu(this);
 m_pmenu2->setObjectName("myMenulist");

//
void Dialog::on_pushButton_2_clicked()
{
    m_pmenu2->clear();

    ListWidgetAction * actionList = new ListWidgetAction(this);
    actionList->SetRowHeight(20);
    actionList->SetMaxHeight(300);
    connect(actionList , &ListWidgetAction::sigClickItem, this, &Dialog::slotMenuClickItem);

    for(int i=0; i<25;i++)
    {
        QString ss;
        ss = QString("菜单kkkkkkkk%1").arg(i);

        actionList->AddString(ss, i);
    }
    m_pmenu2->addAction(actionList);

    m_pmenu2->exec(QCursor::pos());

}

void Dialog::slotMenuClickItem(int id)
{
    m_pmenu2->hide();

    int aa = 0;
    aa++;
}

说明:这一种样式,因为是QWidgetAction实现,所以只支持这种最简单的文字样式

demo源码:QT实战-qt菜单样式实现、自定义带滚动条的菜单实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

健康养生生活

在快节奏的现代生活中&#xff0c;健康养生愈发成为人们关注的焦点。它不仅是一种生活方式&#xff0c;更是对生命质量的珍视与呵护。 健康养生&#xff0c;饮食为先。合理的膳食结构是维持身体健康的基石。我们应确保每餐营养均衡&#xff0c;增加蔬菜、水果、全谷物以及优质蛋…

2023年华数杯数学建模B题不透明制品最优配色方案设计解题全过程文档及程序

2023年华数杯全国大学生数学建模 B题 不透明制品最优配色方案设计 原题再现&#xff1a; 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色存在一定的局限性…

C语言实验 循环结构2

时间:2024.12.3 一、实验 7-1 求符合给定条件的整数集 #include<stdio.h> int main(){int a,b,s,g; scanf("%d",&a);int h=0; for(int i=a;i<=a+3;i++){for(int j=a;j<=a+3;j++){for(int k=a;k<=a+3;k++){if((i!=j)&&(i!=k)&&…

Android10 设备死机的问题分析和解决

最近客户反馈一个问题&#xff0c;设备偶现死机。最后解决&#xff0c;在此记录。 目录 一死机的现象 二死机的类型 三 死机问题分析 1 死机现象的梳理 2 死机日志 1&#xff09;日志分析一 2 日志分析二&#xff08;正确方案&#xff09; 一死机的现象 设备死机&#x…

koa中间件

文章目录 1. koa中间件简介2. 中间件类型1. 应用级中间件2. 路由级中间件3. 错误处理中间件4. 第三方中间件 3.中间件执行流程 1. koa中间件简介 在Koa中&#xff0c;中间件呈现为一个异步函数&#xff0c;该函数支持 async/await 语法&#xff0c;它接收两个参数&#xff1a;…

python学opencv|读取视频(一)灰度视频制作和保存

【1】引言 上一次课学习了用opencv读取图像&#xff0c;掌握了三个函数&#xff1a;cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下&#xff1a; python学opencv|读取图像-CSDN博客 这次课我们继续&#xff0c;来学习用opencv读取视频。 【2】学习资源 首先是官网…

BioDeepAV:一个多模态基准数据集,包含超过1600个深度伪造视频,用于评估深度伪造检测器在面对未知生成器时的性能。

2024-11-29, 由罗马尼亚布加勒斯特大学创建BioDeepAV数据集&#xff0c;它专门设计来评估最先进的深度伪造检测器在面对未见过的深度伪造生成器时的泛化能力&#xff0c;这对于提高检测器的鲁棒性和适应性具有重要意义。 数据集地址&#xff1a;biodeep 一、研究背景&#xff1…

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反&#xff0c;由于它的简单性和可扩展性&#xff0c;它已经获得了普及。在本文中&#xff0c;我将尝试概述它的主要概念&#xff0c;并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

【OpenAI库】从0到1深入理解Python调用OpenAI库的完整教程:从入门到实际运用

文章目录 Moss前沿AI一、初识OpenAI API1.1 获取API-Key&#xff08;两种方案&#xff09;1.2 安装OpenAI库 二、Python调用OpenAI API的基础设置2.1 设置API密钥和Base URL2.2 参数详解 三、构建一个简单的聊天应用3.1 创建聊天请求3.2 参数详解3.3 处理响应 四、完整代码示例…

42 基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值&#xff0c;温度大于阈值则开启水泵&#xff0c;湿度大于阈值则开启风扇…

typecho 添加主题备份及恢复功能

typecho 换主题很简单&#xff0c;但是确有一个比较麻烦的事情&#xff0c;就是主题配置在切换主题的同时也就被删除了。于是&#xff0c;今天我下决心要弄一个备份恢复的功能出来。网上查了很久&#xff0c;都没有找到适合的&#xff08;不过还是有参考价值的&#xff09;。最…

docker部署RustDesk自建服务器

客户端&#xff1a; Releases rustdesk/rustdesk GitHub 服务端&#xff1a; 项目官方地址&#xff1a;GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库&#xff1a; docker pu…

从零开始了解推荐系统(算法构建、召回、粗排、精排、重排、冷启动、衡量标准)

算法构建 推荐算法流程 实际上是一种信息处理逻辑&#xff0c;当获取了用户与内容的信息之后&#xff0c;按照一定的逻辑处理信息后&#xff0c;产生推荐结果。热度排行榜就是最简单的一种推荐方法&#xff0c;依赖的逻辑是当一个内容被大多数用户喜欢&#xff0c;那么大概率…

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步&#xff1a;定义程序的目标 1.8.2 第 2 步&#xff1a;设计程序 1.8.3 第 3 步&#xff1a;编写代码 1.8.4 第 4 步&#xff1a;编译 1.8.5 第 5 步&#xff1a;运行程序 1.8.6 第 6 步&#xff1a;测试和调试程序 1.8.…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展&#xff0c;精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统&#xff08;GPS&#xff09;和惯性导航系统&#xff08;INS&#xff09;在导航应用中各具优势&#xff1a;GPS提供全球定位信息&#xff0c;而INS…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

深入解析级联操作与SQL完整性约束异常的解决方法

目录 前言1. 外键约束与级联操作概述1.1 什么是外键约束1.2 级联操作的实际应用场景 2. 错误分析&#xff1a;SQLIntegrityConstraintViolationException2.1 错误场景描述2.2 触发错误的根本原因 3. 解决方法及优化建议3.1 数据库级别的解决方案3.2 应用层的解决方案 4. 友好提…

dns实验3:主从同步-完全区域传输

服务器192.168.234.111&#xff08;主服务器&#xff09;&#xff0c;打开配置文件&#xff1a; 打开配置文件&#xff1a; 关闭防火墙&#xff0c;改宽松模式&#xff1a; 重启服务&#xff1a; 服务器192.168.234.112&#xff08;从服务器&#xff09;&#xff0c;打开配置文…

LeetCode刷题 -- 分治快排

目录 颜色分类题目解析算法原理代码 排序数组题目解析算法原理代码 数组中第K个最大元素题目解析算法原理代码 LCR 159. 库存管理 III题目解析算法原理代码 颜色分类 题目链接 题目解析 数组分为三块 算法原理 1.如果nums[i] 0&#xff0c;left, i下标对应元素交换&#xff0c…

【论文笔记】Leveraging the Power of MLLMs for Gloss-Free Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Leveraging the Power of …