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条线逐级画,每一条设置透明度逐次加即可实现,而且可以是圆角阴影;

Qt QMenu实现圆角边框菜单,圆角菜单解决。_第1张图片

Qt QMenu实现圆角边框菜单,圆角菜单解决。_第2张图片

头文件menu.h

#ifndef MENU_H
#define MENU_H

#include 

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(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 笔下记录;

你可能感兴趣的:(商务软件)