首页 > 代码库 > 用Qt模仿酷我音乐盒写的个性菜单

用Qt模仿酷我音乐盒写的个性菜单

闲来无事,发现酷我音乐盒的托盘弹出菜单蛮有个性的,于是就按照原样写了个,素材什么的都从网上下的,供大家学习,主要是它的第一项为一个Widget,而Qt的菜单项为QAction,而且这个QAction还不继承于QWidget,后来发现了有个QWidgetAction,这里可以添加自己的Widget,关键要实现一个createWidget()的虚函数。

wKiom1SJXx-B4w77AABUFRB_sAM546.jpg

//菜单初始化
void QMenuTest::contentMenuInit()
{
	m_pContentMenu = new QMenu(this);
	Q_ASSERT(m_pContentMenu);
	SubControlAction* pControlAction = new SubControlAction(m_pContentMenu);
	m_pContentMenu->addAction(pControlAction);
	m_pContentMenu->addSeparator();
	QMenu* pModelMenu = new QMenu(m_pContentMenu);
	pModelMenu->addAction(tr("单曲播放"));
	pModelMenu->addAction(tr("单曲循环"));
	pModelMenu->addAction(tr("顺序播放"));
	pModelMenu->addAction(tr("循环播放"));
	pModelMenu->addAction(tr("随机播放"));
	pModelMenu->setIcon(QIcon(":/res/Resources/model.png"));
	pModelMenu->setTitle(tr("播放模式"));
	m_pContentMenu->addMenu(pModelMenu);
	m_pContentMenu->addAction(tr("显示桌面歌词"));
	m_pContentMenu->addAction(tr("显示音乐树"));
	m_pContentMenu->addAction(QIcon(tr(":/res/Resources/setting.png")),tr("设置"));
	m_pContentMenu->addAction(QIcon(tr(":/res/Resources/exit.png")),tr("退出"));
}
//SubControlAction继承QWidgetAction,下面是.h文件
#ifndef SUBCONTROLACTION_H
#define SUBCONTROLACTION_H

#include <QWidgetAction>
#include "MenuSubControl.h"

class SubControlAction : public QWidgetAction
{
	Q_OBJECT

public:
	SubControlAction(QObject *parent);
	~SubControlAction();
protected:
	QWidget* createWidget(QWidget* parent);
private:
	MenuSubControl* m_pSubControl;
};

#endif // SUBCONTROLACTION_H


//SubControlAction .cpp
#include "StdAfx.h"
#include "SubControlAction.h"

SubControlAction::SubControlAction(QObject *parent)
	: QWidgetAction(parent)
{

}

SubControlAction::~SubControlAction()
{

}

QWidget* SubControlAction::createWidget(QWidget* parent)
{
	m_pSubControl = new MenuSubControl(parent);
	Q_ASSERT(m_pSubControl);
	return m_pSubControl;
}

#ifndef MENUSUBCONTROL_H
#define MENUSUBCONTROL_H

#include <QWidget>
#include "ui_MenuSubControl.h"

class MenuSubControl : public QWidget
{
	Q_OBJECT

public:
	MenuSubControl(QWidget *parent = 0);
	~MenuSubControl();
private:
	Ui::MenuSubControl ui;
};

#endif // MENUSUBCONTROL_H

#include "StdAfx.h"

#include "MenuSubControl.h"


MenuSubControl::MenuSubControl(QWidget *parent)

: QWidget(parent)

{

ui.setupUi(this);

QFile f(":/QSS/SubControl_qss");

f.open(QIODevice::ReadOnly);

setStyleSheet(f.readAll());

}


MenuSubControl::~MenuSubControl()

{


}

ui

wKiom1SJYbzTNf3IAABzNUnzYcQ065.jpg


样式表

QMenu {

     background-color: white;

border: 1px solid gray;

border-style: outset;

border-radius:2px;

padding:2px;

color:black;

 }


 QMenu::item {

     padding: 2px 25px 2px 20px;

     border: 1px solid transparent; /* reserve space for selection border */

 }


 QMenu::item:selected {

     background: rgba(85, 85, 255, 150);

 }


 QMenu::icon:checked { /* appearance of a ‘checked‘ icon */

     background: gray;

     border: 1px inset gray;

     position: absolute;

     top: 1px;

     right: 1px;

     bottom: 1px;

     left: 1px;

 }


 QMenu::separator {

     height: 1px;

     background: gray;

     margin-left: 10px;

     margin-right: 5px;

 }


 QMenu::indicator {

     width: 13px;

     height: 13px;

 }


QPushButton#btn_Switch{

background-color:white;

border-image:url(:/res/Resources/play.png);

min-height:32px;

min-width:32px;

}


QPushButton#btn_Switch:pressed{

border-image:url(:/res/Resources/pause.png);

}


QPushButton#btn_Up{

background-color:white;

border-image:url(:/res/Resources/step_forward.png);

height:24px;

width:24px;

}


QPushButton#btn_Next{

background-color:white;

border-image:url(:/res/Resources/step_next.png);

height:24px;

width:24px;

}


用Qt模仿酷我音乐盒写的个性菜单