《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;
};

源码下载

相关推荐
就叫_这个吧1 天前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡1 天前
AI 应用系统设计
java·开发语言·人工智能
码匠许师傅1 天前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
今天AI了吗1 天前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5211 天前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing1 天前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习1 天前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing1 天前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse1 天前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
丰锋ff1 天前
基于 Qt 的智慧社区物业管理系统
开发语言·qt