Qt QMenu实现圆角边框菜单,圆角菜单解决。

Qt 5.9.1 , 2017年11月10日 20:17:24, 遇到一个棘手的问题,网络上面都找遍了,并没有完全解决菜单Qmenu圆角的问题;再次我研究了一下午,终于出来效果了;
参考了一些文章包括:http://blog.csdn.net/pahxgh/article/details/6874278 他的并没有完全解决,有瑕疵的圆角,对于商务软件绝对不能接受的;

最后感谢这篇文章: https://www.tuicool.com/articles/maU77j 对于阴影的去除,和设置透明的方法,我个人配合了qss来实现,完全解决了圆角问题,但是牺牲了阴影,其实做到这一步已经可以了,阴影是可以自己用QPainter画出来的,我的主窗口面就是画出来的阴影效果,用10条线逐级画,每一条设置透明度逐次加即可实现,而且可以是圆角阴影;



头文件menu.h

#ifndef MENU_H
#define MENU_H

#include <QMenu>

class Menu : public QMenu
{
    Q_OBJECT
public:
    explicit Menu(QWidget *parent = 0);
    explicit Menu(const QString & title);
    void init();

protected:
    virtual bool event(QEvent *event);

signals:

public slots:

};

#endif // MENU_H

menu.cpp

#include "menu.h"
#include "qss.h"
#pragma comment( lib, "dwmapi.lib" )
#include "dwmapi.h"

Menu::Menu(QWidget *parent) : QMenu(parent)
{
    init();
}

Menu::Menu(const QString & title) : QMenu(title)
{
    init();
}

void Menu::init()
{
    Qss::setMenu(this, QColor("#46e6b7"));

    // 必须设置popup, 因为QMenuPrivate::activateAction中使用QApplication::activePopupWidget()函数
    this->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    // 以objectname 区分Qt内置菜单和CCustomMenu
    this->setObjectName("CustomMenu");
}

bool Menu::event(QEvent *event)
{
    static bool class_amended = false;
    if (event->type() == QEvent::WinIdChange)
    {
        HWND hwnd = reinterpret_cast<HWND>(winId());
        if (class_amended == false)
        {
            class_amended = true;
            DWORD class_style = ::GetClassLong(hwnd, GCL_STYLE);
            class_style &= ~CS_DROPSHADOW;
            ::SetClassLong(hwnd, GCL_STYLE, class_style);
        }

    }
    return QWidget::event(event);
}

public:
    static void setMenu(QMenu *menu, QColor hoverColor);

void Qss::setMenu(QMenu *menu, QColor hoverColor)
{
    /*Qmenu Style Sheets*/
    QString qss;
    QFont f("consolas", 12, QFont::Normal);
    qss = "QMenu{ background-color: rgb(255, 255, 255); border: 1px solid rgb(125, 125, 125); /*整个菜单区域的边框粗细、样式、颜色*/ \
                  border-radius: 5px; }"
          "QMenu::item { background-color: transparent; \
                         padding:3px 20px;/*设置菜单项文字上下和左右的内边距,效果就是菜单中的条目左右上下有了间隔*/ \
                         margin:5px 10px;/*设置菜单项的外边距: 长(height) 宽(width)*/ \
                         /*border-bottom:1px solid #DBDBDB;*//*为菜单项之间添加横线间隔*/ }"
          "QMenu::item:selected { background-color: "+ hoverColor.name() +";/*这一句是设置菜单项鼠标经过选中的样式*/ }";
    menu->setStyleSheet(qss);
    menu->setFont(f);
}


用法不用多说,就当作QMenu用;


Menu *setting = new Menu(tr("Setting"));
Menu *layoutVersion = new Menu(tr("Layout version"));

深圳0.01 公司,软件研发工程师 howard 笔下记录;

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值