《QT实用小工具·六十八》基于QMenu开发的炫酷菜单栏

1、概述
源码放在文章末尾

该项目基于QMenu实现了炫酷的菜单栏效果,包含了如下功能:

1、实现了类似word菜单栏的效果,可以在菜单栏中横向添加不同的菜单

2、鼠标点击菜单可以展开菜单栏,再次点击菜单可以收起菜单栏

3、鼠标点击笑脸可以切换菜单栏的背景颜色

项目demo演示如下所示:

使用方式:

1、创建菜单栏对象

cpp 复制代码
MenuBarPlugin* menuPlugin = new MenuBar();

2、在QMainWindow上设置菜单栏

cpp 复制代码
menuPlugin->SetMenuBar(this); //this为继承QMainWindow的界面指针

项目部分代码如下所示:

cpp 复制代码
#pragma once

#include <QMenuBar>
#include "ui_MenuWidget.h"
#include <QMouseEvent>
#include <QEvent>
#include <QTabWidget>
#include <QPaintEvent>

class QMainWindow;
class QMouseEvent;
class QEvent;

struct QRibbonPrivate;

class MenuWidget : public QMenuBar
{
	Q_OBJECT

public:
	MenuWidget(QWidget *parent = nullptr);
	~MenuWidget();

public:
    void install(QMainWindow* window);

    void setColor(const QString& colorName);

public:

    /**
     * 安装本实例至QMainWindow实例,
     * 自动根据QMainWindow的菜单栏创建Ribbon内容
     */
    void initialize(QMainWindow* window);

    /**
     * 卸载
     * TBD
     */
    void uninstall();

    void setStyleButtonVisible(bool visible);

public slots:

    /**
     * 设置标题
     */
    void setWindowTitle(const QString& title);

    /**
     * 切换全屏
     */
    void toggleMaximized();

private slots:

    /**
     * 展开标签页
     */
    void expandTab();

    /**
     * 隐藏标签页
     */
    void hideTab();

    /**
     * 隐藏标签页动画结束
     */
    void onHideTabFinished();

    /**
     * 标签页变化
     */
    void onTabChanged();

    /**
     * 失去焦点时
     */
    void onLostFocus();

    /**
     * tab被点击
     */
    void clickTab();

public slots:
    void on_pushButtonMaxTab_clicked();
    void on_pushButtonMinTab_clicked();

    void showTabWidgetPage(QTabWidget* tabWidget);
protected:
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    void mouseDoubleClickEvent(QMouseEvent* event) override;
   // bool eventFilter(QObject* tgt, QEvent* e) override;
    void paintEvent(QPaintEvent* event) override;

private:
    void initStyle();
    void initWindowPage();
private:
	Ui::MenuWidgetClass ui;

    friend struct QRibbonPrivate;
    QRibbonPrivate* _ribbon;

    QMenu* _styleMenu;

    bool   m_bExpandStaus;

    bool isMaxWindow;
};

源码下载

相关推荐
Mr_Xuhhh1 分钟前
第一部分:类和对象(中)— 取地址运算符重载
java·开发语言
Selegant4 分钟前
告别传统部署:用 GraalVM Native Image 构建秒级启动的 Java 微服务
java·开发语言·微服务·云原生·架构
qq_3106585113 分钟前
mediasoup源码走读(十二)——router
服务器·c++·音视频
Liii40320 分钟前
Java集合详细讲解
java·开发语言
落羽的落羽26 分钟前
【C++】哈希扩展——位图和布隆过滤器的介绍与实现
linux·服务器·开发语言·c++·人工智能·算法·机器学习
汪宁宇29 分钟前
如何在QT5+MinGW环境中编译使用QGIS开发地图应用
c++·qt·qgis·mingw·地图库
fish_xk38 分钟前
类和对象(二)
开发语言·c++·算法
lly20240641 分钟前
Python 列表(List)详解
开发语言
深蓝电商API1 小时前
从 “能爬” 到 “稳爬”:Python 爬虫中级核心技术实战
开发语言·爬虫·python
麦麦鸡腿堡1 小时前
Java_通过反射获取类的结构信息
java·开发语言