QT之自定义菜单
个人建议
自定义, 自定义, 自定义, 顾名思义就是我们自己设计出来效果的菜单, 再如果我们把这个自定义的菜单封装成一个类, 你觉得会不会更好呢, 我现在写的菜单类,我提供两个接口供你使用, 在你需要的地方new一个, 根本不需要理会我里面做了什么操作, 一样界面友好的效果, 是不是很爽呢~在这里, 我个人建议就是, 我们在设计界面上, 不要全部往里塞, 而是一个空壳子, 什么都没有, 拆分成各个独立的小模块, 减少冗余的代码,和UI设计
就像这样的界面,往往里面什么都没有,而是一个空壳子。把我需要的模块动态添加。
效果图
这里两张效果图, 一张是我加了样式的菜单, 一张是默认效果菜单
这两种效果图, 我相信你更倾向于自定义样式的效果图吧~(^__^) 我也知道你能看出其中哪张是默认的,哪张是自定义的 O(∩_∩)O, 好了, 废话不多说了, 我们上代码吧~
上代码
首先来看看, 我封装的自定义菜单类, 而你也只需要拥有这个类, 然后便可召唤出自己的菜单出来吧!
CustomMenu::CustomMenu(QWidget *parent)
: QMenu(parent)
{
setAttribute(Qt::WA_TranslucentBackground);
}
CustomMenu::~CustomMenu()
{
}
void CustomMenu::addCustomMenu(const QString& qsName, const QString& icon, const QString& zhName)
{
QAction *pAction = addAction(QIcon(icon), zhName);
m_menuActionMap.insert(qsName, pAction);
}
QAction* CustomMenu::getAction(const QString& qsName)
{
return m_menuActionMap[qsName];
}
//这里,我只是举例,没添加太多, 而在实际应用中,我们远远不止这些,这可作为你的参考模板,添加属于你自己的菜单封装类.
然后再让我们看看是怎么召唤出菜单类的吧!
void SysTray::onIconActivated(QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::Trigger)
{
m_parent->show();
m_parent->activateWindow();
}
else if (reason == QSystemTrayIcon::Context)
{
addSysTrayMenu();
}
}
void SysTray::addSysTrayMenu()
{
CustomMenu* customMenu = new CustomMenu(m_parent);
customMenu->addCustomMenu("onBottom", TRAY_ICON_ONDNF, tr("onBottom"));
customMenu->addCustomMenu("onMusic", TRAY_ICON_ONMUSIC, tr("onMusic"));
customMenu->addCustomMenu("onFire", TRAY_ICON_ONFIRE, tr("onFire"));
customMenu->addCustomMenu("onCar", TRAY_ICON_ONCAR, tr("onCar"));
customMenu->addCustomMenu("onLol", TRAY_ICON_ONLOL, tr("onLol"));
customMenu->addSeparator();//添加分隔线
customMenu->addCustomMenu("onShow", TRAY_ICON, tr("onShow"));
customMenu->addSeparator();//t添加分割线
customMenu->addCustomMenu("onQuit", CLOSE_MENU, tr("onQuit"));
connect(customMenu->getAction("onShow"), SIGNAL(triggered(bool)), m_parent, SLOT(onShowNormal()));
connect(customMenu->getAction("onQuit"), SIGNAL(triggered(bool)), m_parent, SLOT(onShowQuit()));
customMenu->exec(QCursor::pos());
delete customMenu;//这里,delete千万别忘记。有NEW就有DELETE嘛(*^__^*),当然了,你可以通过智能指针管理,妈妈就再也不用担心我忘记DELETE啦。
}
关于智能指针,可参考C++11智能指针Shared_ptr陷阱
好了,我们的托盘菜单是不是就实现好了,有的小伙伴急了,说到, 你这代码里, 不是没有样式, 你样式怎么弄的?别急,下篇, 我会教大家如何给我们的UI添加漂亮的样式出来。
下代码
关于源码,大家放心,等我把下篇QT之样式讲解完, 我这期的Demo就算讲解完啦, 我就附上这期Demo的工程文件, 当然啦, 免费的,不要你积分 O(∩_∩)O
结尾
只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!
如果你觉得我所写的对你有帮助,默默点个赞哈,你的赞就是我最大的支持,嘿嘿~不要说我骗赞哦,(^__^)