经常使用菜单,菜单的定制相当重要,普通的样式设置不难,一般需求足以实现(QMenu + QAction)。如果要足够个性,则需要进行一定的定制。

    说起定制,其实也是利用Qt中现成的组件进行组装而已,使用QMenu + QWidgetAction + QAction ,再加上QSS美化就可实现个性的QMenu。
先看效果(模仿酷狗所做的一个托盘菜单):




主要代码如下:

SystemTray::SystemTray()
: QSystemTrayIcon()
{
this->createActions();
this->createPlayAction();
this->addActions();
this->translateLanguage();
this->setContextMenu(pop_menu);
}

SystemTray::~SystemTray()
{
}

void SystemTray::translateLanguage()
{
this->setToolTip(tr("hey music"));
this->switchPlayToolTip(is_paly);
        backward_button->setToolTip(tr("backward"));
        forward_button->setToolTip(tr("forward"));

show_action->setText(tr("show"));
setting_action->setText(tr("setting"));
lock_lrc_action->setText(tr("lock lrc"));
this->showLrc(is_show);
login_action->setText(tr("login"));
logout_action->setText(tr("logout"));
}

void SystemTray::createActions()
{
this->setIcon(QIcon(":/images/music.png"));

pop_menu = new QMenu();
show_action = new QAction(pop_menu);
setting_action = new QAction(pop_menu);
lock_lrc_action = new QAction(pop_menu);
show_lrc_action = new QAction(pop_menu);
login_action = new QAction(pop_menu);
logout_action = new QAction(pop_menu);

connect(show_action, &QAction::triggered, this, &SystemTray::showWidget);
connect(show_lrc_action, &QAction::triggered, this, static_cast(&SystemTray::showLrc));
connect(login_action, &QAction::triggered, this, &SystemTray::showLoginWidget);
connect(logout_action, &QAction::triggered, this, &SystemTray::logoutWidget);
}

void SystemTray::createPlayAction()
{
play_widget = new QWidget();
play_widget_action = new QWidgetAction(pop_menu);
play_button = new QPushButton();
backward_button = new QPushButton();
forward_button = new QPushButton();
music_name_label = new QLabel();

music_name_label->setFixedWidth(MUSIC_NAME_WIDTH);
music_name_label->setAlignment(Qt::AlignCenter);
QPixmap play_pixmap(":/action/pause");
        play_button->setIcon(play_pixmap);
play_button->setIconSize(play_pixmap.size());
play_button->setObjectName("transparentButton");

QPixmap  backward_pixmap(":/action/backward");
        backward_button->setIcon(backward_pixmap);
backward_button->setIconSize(backward_pixmap.size());
backward_button->setObjectName("transparentButton");

QPixmap forward_pixmap(":/action/forward");
        forward_button->setIcon(forward_pixmap);
forward_button->setIconSize(forward_pixmap.size());
forward_button->setObjectName("transparentButton");

backward_button->setCursor(Qt::PointingHandCursor);
play_button->setCursor(Qt::PointingHandCursor);
forward_button->setCursor(Qt::PointingHandCursor);

QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(backward_button);
layout->addWidget(play_button);
layout->addWidget(forward_button);
layout->setSpacing(0);
layout->setContentsMargins(20, 0, 20, 0);

QVBoxLayout *layout2 = new QVBoxLayout();
layout2->addLayout(layout);
layout2->addWidget(music_name_label, 0, Qt::AlignCenter);
layout2->setSpacing(5);
layout2->setContentsMargins(0, 0, 0, 5);
music_name_label->setText("player");
music_name_label->setEnabled(false);
play_widget->setLayout(layout2);
play_widget_action->setDefaultWidget(play_widget);

connect(play_button, &QPushButton::clicked, this, &SystemTray::play);
connect(backward_button, &QPushButton::clicked, this, &SystemTray::skipBackward);
connect(forward_button, &QPushButton::clicked, this, &SystemTray::skipForward);
}

void SystemTray::addActions()
{
pop_menu->addAction(play_widget_action);
pop_menu->addSeparator();
pop_menu->addAction(show_action);
pop_menu->addSeparator();
pop_menu->addAction(setting_action);
pop_menu->addAction(lock_lrc_action);
pop_menu->addAction(show_lrc_action);
pop_menu->addSeparator();
pop_menu->addAction(login_action);
pop_menu->addAction(logout_action);
}

QMenu的个性化定制的更多相关文章

  1. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  2. ECharts-基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表

    ECharts http://ecomfe.github.com/echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算 ...

  3. 【SSO单点系列】(2):CAS4.0 登录页的个性化定制

    上一篇 [SSO单点系列](1):CAS环境的搭建介绍了CAS最简单环境的搭建,以及一个例子用来讲解CAS的一个最基础的用法. 今天主要是介绍如何对CAS登录页进行个性化定制.    一.开始 下图是 ...

  4. iTerm2和oh-my-zsh的个性化定制

    终于在某东做活动新入手了一台air,看身边小伙伴的mac的终端感觉好炫酷,于是乎准备自己也捯饬捯饬,google了一下,发现了osx平台上的终端神器iTerm2和用来代替bash的oh-my-zsh, ...

  5. 使用 Gradle 对应用进行个性化定制

    啥也不说了,直接进入主题吧.本篇文章主要根据实际开发中遇到的需求,讲解使用 Gradle 对应用的不同版本进行个性化定制. 场景介绍 一般的应用基本上都有正式服和测试服,这个就不需要多说了.但是有些应 ...

  6. Maven的个性化定制

    用Maven的小伙伴都知道,Maven的宗旨是约定优于配置(Convention Over Configuration). 在宗旨的前提下Maven也提供了个性化定制的Profile,让我们看看使用方 ...

  7. 汽车行业如何个性化定制转型?看APS系统在这家企业的运用

    传统汽车行业中往往采用的是按库存推动式生产,一旦市场产生变动就会造成大量的生产,给企业带来大批的资金压力,而另一方面采用按单生产的方式企业往往面临供应链,产能的诸多约束条件限制,稍有不慎就会带来产线停 ...

  8. CRM系统个性化定制的对企业的优势作用

    伴随着科学技术的不断发展,企业信息化建设也在持续地开展.企业管理模式已经开始由传统模式向信息化转变,并且越来越多的企业开始使用互联网软件来进行辅助管理,这一趋势也让CRM客户管理系统得到快速的发展.市 ...

  9. 剖析QMenu & Qt完全定制化菜单

    贴张效果图:  定制包括: 1. 周边阴影 2. 菜单项的元素(分割符, 控制ICON大小, 文字显示位置与颜色, 子菜单指示符) 菜单内的效果, 部分可以使用stylesheet实现, 但要做到这样 ...

随机推荐

  1. DTCMS清除 &

    DTcms.Common\Utils.cs #region 清除HTML标记 public static string DropHTML(string Htmlstring) 中的 Htmlstrin ...

  2. CocoaPods安装和使用及问题:Setting up CocoaPods master repo

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...

  3. 同时存在两个或多个homestead 虚拟box

    开发中发现,不同版本的homestead 里面的环境各不相同,里面的node,npm等版本都不一致,如果需要添加 不同版本的homestead同时存在可以按照以下办法处理. tips: 提供可以离线下 ...

  4. Building microservices with Spring Cloud and Netflix OSS, part 2

    In Part 1 we used core components in Spring Cloud and Netflix OSS, i.e. Eureka, Ribbon and Zuul, to ...

  5. ubuntu 下配置Python wxWidgets (复制自官方网站)

    全系统英文官网操作地址:http://wxpython.org/download.php Ubuntu 英文操作地址:http://wiki.wxpython.org/InstallingOnUbun ...

  6. python中执行javascript代码

    python中执行javascript代码: 1.安装相应的库,我使用的是PyV8 2.import PyV8 ctxt = PyV8.JSContext()     ctxt.enter()     ...

  7. 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  8. javascript event兼容IE和FF

    事件对象在IE和FF下的兼容写法 function abc(event){ var e=event||window.event; //键盘码的捕获 var key=e.which||e.keyCode ...

  9. Java实现mysql数据库备份

    Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...

  10. You have new mail in /var/spool/mail/root 烦不烦你?

    http://blog.csdn.net/yx_l128125/article/details/7425182