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

来源:互联网 发布:shell python 编辑:程序博客网 时间:2024/05/22 18:39

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