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

源码下载

相关推荐
wkd_0079 小时前
【C++ | STL】std::vector 复制的几个方法总结
c++·stl·std vector·复制vector·vector复制
松涛和鸣9 小时前
25、数据结构:树与二叉树的概念、特性及递归实现
linux·开发语言·网络·数据结构·算法
莫物9 小时前
Java后端请求不同环境下的同一接口,有的环境会出现乱码问题
java·开发语言
MM_MS9 小时前
SQL Server数据库和Visual Studio (C#)联合编程
开发语言·数据库·sqlserver·c#·visual studio
惺忪97989 小时前
Qt C++11/14/17 新特性大全详解
开发语言·c++
Pacify_The_North9 小时前
【C++11(二)】可变参数模板和 lambda表达式
java·开发语言·c++
顺顺 尼9 小时前
包装器c++11
开发语言·c++
阿里嘎多学长9 小时前
2025-12-05 GitHub 热点项目精选
开发语言·程序员·github·代码托管
王光环9 小时前
C语言写exe脚本
c语言·开发语言
8278209379 小时前
python scp 备份
开发语言·python