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

本文主要介绍了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菜单样式实现、自定义带滚动条的菜单实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java Springboot校园论坛APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开…

深度学习基础03_BP算法(下)过拟合和欠拟合

目录 一、BP算法(下) 0、反向传播代码回顾 写法一&#xff1a; 写法二(更常用)&#xff1a; 1、BP中的梯度下降 1.数学描述 2.传统下降方式 3.优化梯度下降方式 指数加权平均 Momentum AdaGrad RMSProp Adam(常用) 总结 二、过拟合和欠拟合 1、概念 1.过拟合 …

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将 pdf 文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需…

Apache Doris 现行版本 Docker-Compose 运行教程

特别注意&#xff01;Doris On Docker 部署方式仅限于开发环境或者功能测试环境&#xff0c;不建议生产环境部署&#xff01; 如有生产环境或性能测试集群部署诉求&#xff0c;请使用裸机/虚机部署或K8S Operator部署方案&#xff01; 原文阅读&#xff1a;Apache Doris 现行版…

1.Git安装与常用命令

前言 Git中会用到的一些基本的Linux命令 ls/ll 查看文件目录 (ll可以看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 1.下载与安装 安装成功后鼠标右键会出现Git Bash和Git GUI Git GUI&#xff1a;GUI图形化界面 Git Bash&#xff1a;Git提供的命令行工具 当安装…

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

【AI系统】Ascend C 语法扩展

Ascend C 语法扩展 Ascend C 的本质构成其实是标准 C加上一组扩展的语法和 API。本文首先对 Ascend C 的基础语法扩展进行简要介绍&#xff0c;随后讨论 Ascend C 的两种 API——基础 API 和高阶 API。 接下来针对 Ascend C 的几种关键编程对象——数据存储、任务间通信与同步…

【合作原创】使用Termux搭建可以使用的生产力环境(二)

前言 上期文章没看的可以先从上期文章开始看起 【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;一&#xff09;-CSDN博客 目前我们已经完成了FinalShell ssh连接手机Termux的功能了&#xff0c;这期我们继续朝我们的目标前进。今天早上有读者进群以为生成环境指…

UG NX二次开发(C#)-选择对象居中(不是全部居中)

文章目录 1、前言2、什么是对象居中3、功能实现代码3.1 对象居中3.1 恢复原视图1、前言 在UG NX二次开发过程中,我们经常会用到居中以查看完整的模型,但是对于如果想展示某些对象,而不是全部模型时,那么我们就想将选择的对象(如体对象)居中查看,当查看结束后还能恢复到…

群控系统服务端开发模式-应用开发-短信工厂七牛云短信开发

一、七牛云短信工厂开发 1、添加框架对应的SDK composer require qiniu/php-sdk 2、添加七牛云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下&#xff0c;创建七牛云短信发送工厂并命名为QiniuyunSmsSender。记住&#xff0c;一定要在七牛云短信发送工厂类名后面去…

机器学习概述,特征工程简述2.1——2.3

机器学习概述&#xff1a; 1.1人工智能概述 达特茅斯会议—人工智能的起点 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 1.1.2 机器学习和深度学习能做什么 传统预测 图像识别 自然语言处理 1.2什么是机器学习 数据 模型 预测 从历史数…

基于vite6+ vue3 + electron@33 实现的 局域网内互传文件的桌面软件

目录 项目介绍项目部分截图介绍下基础项目搭建先搭建一个vite 前端项目 再安装 electron 相关依赖依赖安装失败解决方案修改 vite配置文件和 ts 配置文件修改packjsonts相关配置项目结构介绍 项目介绍 前端 基于 vue3 ts windicss 后端 就是node 层 项目地址&#xff1a; h…

Linux 内核系统架构

Linux 内核是一个复杂且高度模块化的系统&#xff0c;负责操作硬件资源、管理进程和内存、提供网络服务、执行文件系统操作、进行设备驱动程序的管理等。它为用户空间提供了一个抽象层&#xff0c;并为应用程序提供了底层服务。本文将深入探讨 Linux 内核的系统架构&#xff0c…

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

计算机网络——不同版本的 HTTP 协议

介绍 HTTP&#xff0c;即超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;是应用层的一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

Fastapi + vue3 自动化测试平台---移动端App自动化篇

概述 好久写文章了&#xff0c;专注于新框架&#xff0c;新UI界面的实践&#xff0c;废话不多说&#xff0c;开搞 技术架构 后端&#xff1a; Fastapi Airtest multiprocessing 前端&#xff1a; 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…

警惕开源信息成为泄密源头

文章目录 前言一、信息公开需谨慎1、警惕采购招标泄密。2、警惕信息公开泄密。3、警惕社交媒体泄密。 二、泄密风险需严防1、健全制度&#xff0c;明确责任。2、加强管控&#xff0c;严格审查。3、提高意识&#xff0c;谨言慎行。 前言 大数据时代&#xff0c;信息在网络空间发…

指针(上)

目录 内存和地址 指针变量和地址 取地址&#xff08;&&#xff09; 解引用&#xff08;*&#xff09; 大小 类型 意义 const修饰 修饰变量 修饰指针 指针运算 指针- 整数 指针-指针 指针的关系运算 野指针 概念 成因 避免 assert断言 指针的使用 strl…

常见的数据结构---队列、树与堆的深入剖析

目录 一、队列 二、树 三、堆 在现代计算机科学与工程领域&#xff0c;队列、树和堆是三种极其重要的基础数据结构&#xff0c;它们各自具有独特的特点和应用。在日常开发中&#xff0c;合理选择和使用这些数据结构可以显著提高程序的效率和可维护性。它们不仅奠定了算法设计…