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 笔下记录;
阅读全文
0 0
- Qt QMenu实现圆角边框菜单,圆角菜单解决。
- Qt: 隐藏菜单QMenu
- Qt: 隐藏菜单QMenu
- Qt: 隐藏菜单QMenu
- Qt: 隐藏菜单QMenu
- Qt 4.x实现QMenu菜单向上弹出菜单方法
- QMenu,QT的菜单添加
- qt中的菜单QMenu QAction
- qt中的菜单QMenu QAction
- Qt的QMenu圆角处理
- QT QButton to QMenu自定义菜单
- 关于QT的菜单QMenu和QAction
- Qt菜单 QMenu QAction连接信号槽函数
- Qt中QMenu的菜单关闭处理方法
- Qt中QMenu的菜单关闭处理方法
- QMenu 设置菜单图标 & 生成菜单树
- CSS实现菜单圆角背景
- CSS实现菜单圆角背景
- 6.3程序改错
- C++实习笔记(4)
- centos/linux 断电后,开机光标闪现不能开启,重新引导
- RBAC权限控制【TP3.2实现】
- Android okhttp+rxjava实现多文件下载和断点续传
- Qt QMenu实现圆角边框菜单,圆角菜单解决。
- # 阿里热更新方案
- Java泛型详解
- 5.5 判断是否闰年
- pat 是否同一棵二叉搜索树
- 使用ListView控件展示数据
- AngularJS过滤选择器
- 计算两整数的最大值
- 预习内容