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